工厂方法模式(标准的工厂模式),是对简单工厂模式进行了扩展。
一般在创建具体商品对象前,要进行一些条件判断。
但是如果把所有条件都写到主工厂里,会让工厂类显得臃肿。
于是需要开设一些子工厂,来分别生产相应的商品;把条件判断写在子工厂里。
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
| /**
* 电视机类
*/
class TV{
private $_name = '电视机';
private $_price = 1000;
public function __toString()
{
$str = '产品:'.$this->_name;
$str .= '<br />价格:'.$this->_price;
return '<br /><br />'.$str;
}
}
/**
* 电脑类
*/
class PC{
private $_name = '电脑';
private $_price = 5000;
public function __toString()
{
$str = '产品:'.$this->_name;
$str .= '<br />价格:'.$this->_price;
return '<br /><br />'.$str;
}
}
/**
* 生产方法的抽象接口
*/
interface ICreator{
function realCreate();
}
/**
* 电视机创建类(子工厂)
* 实现生产接口
*/
class TVCreator implements ICreator{
public function realCreate()
{
if( 显像管有货 && 荧光屏有货 ){ //创建前先判断材料是否齐全
return new TV();
}
}
}
/**
* 电脑创建类(子工厂)
* 实现生产接口
*/
class PCCreator implements ICreator{
public function realCreate()
{
if( CPU有货 && 内存有货 ){ //创建前先判断材料是否齐全
return new PC();
}
}
}
/**
* 商品创建类(主工厂)
*/
class GoodsCreator{
public function create($goods)
{
//先根据参数创建具体的子工厂
$gc = $goods.'Creator';
$goods_creator = new $gc;
return $goods_creator->realCreate(); //子工厂进行具体生产
}
}
/**
* 开始测试
*/
$gc = new GoodsCreator(); //创建主工厂
$goods1 = $gc->create('TV'); //新建一个电视机商品
$goods2 = $gc->create('PC'); //新建一个电脑商品
echo $goods1;
echo $goods2;
/*
产品:电视机
价格:1000
产品:电脑
价格:5000
*/ |
注意:如要运行,需要修改例子中两个子工厂里的判断条件。