介绍
工厂实例推迟到子类实例化,从而避免了简单工厂模式对内部进行修改的问题。所以工厂方法模式就是让子类来做决定。
项目结构

UML
图

代码
Mouse.php
1 2 3 4 5 6 7
| <?php
interface Mouse { public function click(); }
|
Factory.php
1 2 3 4 5 6 7
| <?php
interface Factory { public function create(); }
|
WinMouse.php
1 2 3 4 5 6 7 8 9 10 11
| <?php
class WinMouse implements Mouse {
public function click() { return 'win mouse click'; } }
|
MacMouse.php
1 2 3 4 5 6 7 8 9 10 11
| <?php
class MacMouse implements Mouse {
public function click() { return 'mac mouse click'; } }
|
WinFactory.php
1 2 3 4 5 6 7 8 9 10 11
| <?php
class WinFactory implements Factory {
public function create() { return new WinMouse(); } }
|
MacFactory.php
1 2 3 4 5 6 7 8 9 10 11
| <?php
class MacFactory implements Factory {
public function create() { return new WinMouse(); } }
|
总结
① 定义了一个创建对象的接口,但由子类来决定实例化哪一个,工厂方法让类把实例化推迟到子类
② 工厂方法就是抽象类提供的一个创建对象的方法的接口
设计原则之一:要依赖抽象,不要依赖具体类;不管高层或底层组件,都应该依赖于抽象