工厂方法模式(标准的工厂模式),是对简单工厂模式进行了扩展。
一般在创建具体商品对象前,要进行一些条件判断。
但是如果把所有条件都写到主工厂里,会让工厂类显得臃肿。
于是需要开设一些子工厂,来分别生产相应的商品;把条件判断写在子工厂里。
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 */ |
注意:如要运行,需要修改例子中两个子工厂里的判断条件。