工厂模式

意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。

适用性

当一个类不知道它所必须创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

结构

factory
从图上可以看出,工厂模式和简单工厂模式的区别是将工厂也进行了抽象,定义了工厂的接口,每个产品的生成由专门的工厂负责,主要有三个元素,1、client(调用工厂);2、工厂类(生成者);3、产品类

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//工厂类
interface factory{
public function getProduct();
}
class factoryA implements factory
{
public function getProduct()
{
return new ProductA();
}
}
class factoryB implements factory
{
public function getProduct()
{
return new ProductB();
}
}
//产品类
interface product
{
public function getProductName();
}
class productA implements product
{
public function getProductName()
{
echo "I am product A" . PHP_EOL;
}
}
class productB implements product
{
public function getProductName()
{
echo "I am product B" . PHP_EOL;
}
}
//client
try
{
//生成产品A
$factory = new factoryA();
$product = $factory->getProduct();
$product->getProductName();
//生成产品B
$factory = new factoryB();
$product = $factory->getProduct();
$product->getProductName();
}
catch(Exception $e)
{
echo $e->getMessage() . PHP_EOL;
}

明显特征

1、工厂类和简单工厂类相比,明显的特征就是创建产品不是一个工厂,而是多个工厂,相当于分工更加的明确
2、从client角度来看,创建产品不用在告诉工厂我要什么产品,而是直接找某个工厂要产品。

参考文献

1.设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
2.23种设计模式
3.PHP设计模式笔记:使用PHP实现工厂模式