初识设计模式——简单工厂模式(Simple Factory Pattern)
简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的方式,将对象的创建和使用分离。简单工厂模式定义了一个工厂类,该类负责根据客户端的请求创建不同类型的对象,客户端只需要向工厂类传递必要的参数,而不需要关心对象的具体创建过程。
角色组成
- 工厂类(Factory):负责创建产品对象的类,通常包含一个创建对象的方法,根据传入的参数决定创建哪种具体产品对象。
- 抽象产品类(Abstract Product):定义产品的公共接口或抽象类,所有具体产品类都要实现这个接口或继承这个抽象类。
- 具体产品类(Concrete Product):实现抽象产品类定义的接口,是工厂类创建的具体对象。
优缺点分析
优点
缺点
- 工厂类职责过重:工厂类集中了所有产品的创建逻辑,当产品种类较多时,工厂类的代码会变得复杂,难以维护。
- 不符合开闭原则:每次添加新的产品类,都需要修改工厂类的代码,违反了开闭原则(对扩展开放,对修改关闭)。
代码示例
简单工厂模式中工厂对象的主要功能是决定创建出哪一种产品类,所以,工厂类中是存在判断的。以实现一个简单的计算器为例。
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
| <?php Interface Claculator { function evaluate($numberA, $numberB); }
class Add implements Claculator { public function evaluate($numberA, $numberB) { return $numberA+$numberB; } }
class Tract implements Claculator { public function evaluate($numberA, $numberB) { return $numberA-$numberB; } }
class Ride implements Claculator { public function evaluate($numberA, $numberB) { return $numberA*$numberB; } }
class Divide implements Claculator { public function evaluate($numberA, $numberB) { if ($numberB==0) return null; return $numberA/$numberB; } }
class Factory { public static function getClaculator($type) { switch ($type) { case '+' : $server = new Add(); break; case '-' : $server = new Tract(); break; case '*' : $server = new Ride(); break; case '/' : $server = new Divide(); break; default : $server = null; break; } return $server; } }
$numberA = isset($_GET['a'])?$_GET['a']:0; $numberB = isset($_GET['b'])?$_GET['b']:0; $type = isset($_GET['type'])?$_GET['type']:'+'; $server = Factory::getClaculator($type); if (empty($server)) $result = 0; else $result = $server->evaluate($numberA, $numberB); var_dump($result);
|
UML类图

总结
简单工厂模式主要减少了客户端代码的修改,降低了耦合性。以上述代码为例,假如现在需要扩展这个计算器,为这个计算器加一个平方根的计算功能,只需要增加一个SquareRoot类继承Claculator接口,在简单工厂中增加一条分支即可,无需改变客户端的代码。
但是设计模式的六大原则中存在一个开闭原则(Open-Closed Principle, OCP),其中的Factory显然违背了这一原则,所以简单工厂模式并不属于23种GOF设计模式之一,而工厂模式与简单工厂模式的区别主要也在这里。