设计模式学习笔记(开篇)-抽象工厂 工厂模式 简单工厂(2)

继续上篇 设计模式学习笔记(开篇)-抽象工厂 工厂模式 简单工厂(1) 继续说。

上篇讲到了简单工厂模式。简述了它的实现、作用、优点、缺点。同时留下了一个问题。在SimpleFactory这个工厂类中,简单的实现工具的选择是不复杂的,但是当我们加入的产地选择的适合,SimpleFactory的代码量几乎成倍增长,会出现大量的if else。这对于SimpleFactory的维护者(开发者)来说,这是一件非常难受的事,同时,加入的产地的选择,会改变原有的接口模式。可能造成之前的使用者不不得不修改原有的代码,以适应你的修改。对使用者来说,也是件不爽的事情。

因为简单工厂的扩展性不好,不适合复杂的对象创建。要怎么解决上面的问题

当然我们可以为不同产地的建立不同的简单工厂,让使用者自行选择要使用哪个工厂。这是一个好的解决方法,这样使用者就不需要改变原来的接口。当需要不同产地时,只需要选择不同产地的工厂就好了。但是也有个问题。如果不同产地的工厂是不同的开发者,他们定义了各种各样的接口 比如A开发者 定义 CreateToolA,B开发者定义CreateToolB。那这样使用者就需要记忆很多接口。这也不利于使用者。所以,对于接口的开发者,我们是否可以定义一种开发框架。让所有开发者按照这个框架进行创建接口工厂。

顺着这个思路,我们首先创建一个接口开发框架:

interface  ITool{}
	public function createTool($flag);
}

然后中国开发者开发中国的工厂模式

//中国工具创建
class ChinaTool implements ITool {
	public function createTool($flag) {
		if($flag == 'SmallHammer') {
			return new SmallHammer();
		}
		else if($flag == 'BigHammer') {
			return new BigHammer()
		}
		else if($flag == 'StraightScrewdriver') {
			return new StraightScrewdriver()
		}
		else if($flag == 'CrossScrewdriver') {
			return new CrossScrewdriver();
		}
		return null;		
	}
}

美国开发者开发美国的工厂模式

class AmericaTool implements ITool  {
	public function createTool($flag) {
		if($flag == 'SmallHammer') {
			return new AmericaSmallHammer();
		}
		else if($flag == 'BigHammer') {
			return new AmericaBigHammer()
		}
		else if($flag == 'StraightScrewdriver') {
			return new AmericaStraightScrewdriver()
		}
		else if($flag == 'CrossScrewdriver') {
			return new AmericaCrossScrewdriver();
		}
		return null;		
	}	
}

使用者要使用不同的工厂方法。

//让使用者只依赖于ITool这个接口,而不依赖具体的工具工厂
class UseTool {
	private $tools = null
	public function __construct(ITool $tools) {
		$this->$tools = $tools
	}
	public createTool($flag) {
		$this->tools->createTool($flag);
	}
}

//中国工具的使用
$ChinaTool = new ChinaTool();
$UseTool = new UseTool($ChinaTool);
$UseTool->createTool("SmallHammer");
//美国工具的使用
$AmericaTool = new AmericaTool();
$UseTool = new UseTool($ChinaTool);
$UseTool->createTool("SmallHammer");

 你看,上面的实现过程是不是解决了设计模式学习笔记(开篇)-抽象工厂 工厂模式 简单工厂(1) 中当增加产地时需要维护大量了if else 的逻辑。对于扩展,只需简单继承ITool这个类,然后实现具体代码即可。这非常符合OCP(开放-关闭原则)。同时UseTool 只需要依赖ITool,不依赖具体的工厂实现,这就解耦了。

好了总结一下,其实上面的实现方式就是工厂模式的实现流程。

工厂模式主要是创建一个框架,让子类决定如何实现。这种开发具有弹性且扩展简单,符合OCP。

好的,现在解决工具使用和开发的问提。现在要想想,工具的制造问题,常说中国制造,美国制造。 假如我们要制造一个把剪刀,需要选择制造剪刀工艺(大小,外形等),指定剪刀材料(不锈钢,铝合金等),剪刀把手的颜色(红,黑,绿)等。 
那么我们怎么实现不同国家制造剪刀流程。难道要把剪刀的制造工艺,材料,和把手颜色的全部放在一个工厂中实现。者显然不对。

这个问题,我们在下篇文章中解决。

猜你喜欢

转载自blog.csdn.net/H_L_S/article/details/85442637