初识设计模式——工厂模式(Factory Pattern)
工厂模式(Factory Pattern)是一种创建型设计模式,其核心思想是将对象的创建逻辑与使用逻辑解耦,通过一个工厂类统一负责对象的实例化。它通过定义一个创建对象的接口,让子类决定实例化哪个类,从而降低客户端与具体产品的耦合度。
结构组成
- 抽象产品(Product):定义产品的公共接口或抽象类,声明产品的核心方法。
- 具体产品(Concrete Product):实现抽象产品接口,提供具体的功能实现。
- 抽象工厂(Creator):声明创建产品的抽象方法,通常是一个抽象类或接口。
- 具体工厂(Concrete Creator):实现抽象工厂的创建方法,返回具体产品的实例。

示例
工厂接口
1 2 3 4 5 6 7 8 9 10 11 12
| <?php include './Claculator.php'; include './claculator/Add.php'; include './claculator/Divide.php'; include './claculator/Tract.php'; include './claculator/Ride.php'; interface Factory { static function createClaculator(); }
|
加法工厂
1 2 3 4 5 6 7 8 9
| <?php class AddFactory implements Factory { public static function createClaculator() { return new Add(); } }
|
减法工厂
1 2 3 4 5 6 7 8 9
| <?php class TractFactory implements Factory { public static function createClaculator() { return new Tract(); } }
|
乘法工厂
1 2 3 4 5 6 7 8 9
| <?php class RideFactory implements Factory { public static function createClaculator() { return new Ride(); } }
|
除法工厂
1 2 3 4 5 6 7 8 9
| <?php class DivideFactory implements Factory { public static function createClaculator() { return new Divide(); } }
|
计算接口
1 2 3 4 5 6
| <?php Interface Claculator { function evaluate($numberA, $numberB); }
|
加法计算类
1 2 3 4 5 6 7 8 9
| <?php class Add implements Claculator { public function evaluate($numberA, $numberB) { return $numberA+$numberB; } }
|
减法计算类
1 2 3 4 5 6 7 8 9
| <?php class Tract implements Claculator { public function evaluate($numberA, $numberB) { return $numberA-$numberB; } }
|
乘法计算类
1 2 3 4 5 6 7 8 9
| <?php class Ride implements Claculator { public function evaluate($numberA, $numberB) { return $numberA*$numberB; } }
|
除法计算类
1 2 3 4 5 6 7 8 9 10 11
| <?php class Divide implements Claculator { public function evaluate($numberA, $numberB) { if ($numberB==0) return null; return $numberA/$numberB; } }
|
客户端代码
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
| <?php $numberA = isset($_GET['a'])?$_GET['a']:0; $numberB = isset($_GET['b'])?$_GET['b']:0; $type = isset($_GET['type'])?$_GET['type']:'+'; include './Factory.php'; include './factory/DivideFactory.php'; include './factory/AddFactory.php'; include './factory/TractFactory.php'; include './factory/RideFactory.php'; switch ($type) { case '+': $server = AddFactory::createClaculator(); break; case '-': $server = TractFactory::createClaculator(); break; case '*': $server = RideFactory::createClaculator(); break; case '/': $server = DivideFactory::createClaculator(); break; case '': $server = null; break; } if (empty($server)) $result = 0; else $result = $server->evaluate($numberA, $numberB); var_dump($result);
|
UML类图

工厂模式的优缺点
优点
- 解耦创建与使用:客户端无需知道具体产品类的细节,只需通过工厂获取对象。
- 扩展性强:新增产品时只需添加新的具体产品和具体工厂,符合开闭原则。
- 符合单一职责原则:创建逻辑集中在工厂类,代码更清晰。
缺点
- 类数量增加:每个产品需对应一个具体工厂,可能导致系统复杂度上升。
- 抽象程度高:对于简单场景可能过度设计。
工厂模式与简单工厂模式的区别
工厂模式:强调 “通过子类扩展”,每个具体工厂负责创建一种产品,符合开闭原则。
简单工厂模式:所有产品创建逻辑集中在一个工厂类中,通过条件判断决定创建哪种产品,违背开闭原则。
总结
工厂模式是一种灵活且可扩展的对象创建方式,适用于需要动态扩展产品类型的场景。虽然会增加类的数量,但能有效降低代码耦合度,提升系统的可维护性。在实际开发中,需根据项目复杂度选择工厂方法或简单工厂模式。