参考网站:http://blog.youkuaiyun.com/uuleaf/article/details/7572514
【案例】
承接上一篇简单工厂模式。黑枣克隆公司在初始发展阶段使用简单工厂模式来生产克隆狗,狗的分类方式局限于按颜色分类。由于市场需求变化,客户对同一颜色狗有了体型大小要求,分为大型狗及小型狗两类。
【分析OOA】
如果我是黑枣克隆公司老板,我可能要开设分厂。使用大型狗工厂专门生产大型狗,小型狗工厂专门生产小型狗。其实软件工程师也会去这样实现。工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。
【设计OOD】
<UML>
<说明>
1、抽象工厂角色Factory: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。
2、具体工厂角色SmallDogFactory及BigDogFactory:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
3、抽象产品角色Dog:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
4、具体产品角色RedBigDog\RedSmallDog\BlackBigDog\BlackSmallDOg:具体工厂角色所创建的对象就是此角色的实例。
【编程 OOP】
<代码>
- interface Dog
- {
- public function shout();
- }
- class BlackBigDog implements Dog
- {
- public function shout()
- {
- echo "BlackBigDog Wao!Wao!Wao! \n";
- }
- }
- class RedBigDog implements Dog
- {
- public function shout()
- {
- echo "RedBigDog Wao!Wao!Wao! \n";
- }
- }
- class RedSmallDog implements Dog
- {
- public function shout()
- {
- echo "RedSmallDog Wao!Wao!Wao! \n";
- }
- }
- class BlackSmallDog implements Dog
- {
- public function shout()
- {
- echo "BlackSmallDog Wao!Wao!Wao! \n";
- }
- }
- interface DogFactory
- {
- public function create($color);
- }
- class BigDogFactory implements DogFactory
- {
- public function create($color)
- {
- $dogtype = ucfirst(strtolower($color)) . 'BigDog';
- if (class_exists($dogtype)) {
- return new $dogtype();
- }
- }
- }
- class SmallDogFactory implements DogFactory
- {
- public function create($color)
- {
- $dogtype = ucfirst(strtolower($color)) . 'SmallDog';
- if (class_exists($dogtype)) {
- return new $dogtype();
- }
- }
- }
【测试用例Test Case】
<代码>
- class testDriver
- {
- public function run()
- {
- $factory1 = new BigDogFactory();
- $dog1 = $factory1->create('black');
- $dog1->shout();
- $factory2 = new SmallDogFactory();
- $dog1 = $factory2->create('red');
- $dog1->shout();
- }
- }
- $test = new testDriver();
- $test->run();
【输出】
【小结】
工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类。
当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了"开放-封闭"原则。
这里还请注意一下,创建者类与产品的层次结构是非常相似的。在本案例中,大狗厂子只生产大狗,小狗厂子只生产小狗。这是工厂方法模式常见的使用情景,但是这也导致一些代码重复,如狗的子类会太多。工厂方法模式常常和抽象工厂模式一起使用。
********************************************
* 作者:叶文涛
* 标题:Php设计模式之工厂模式(二)【工厂方法模式 Factory Method】
* 参考:
* 《Head First设计模式》Eric Freeman等著
*《PHP高级程序设计:模式、框架和测试》 Kevin McArthur 著 汪泳 等译
******************转载请注明来源 ***************