简单工厂模式定义
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现
简单工厂的 UML 图
简单工厂模式中的各个角色以及相应职责:
- 简单工厂: 简单工厂模式的核心,由它负责创建所有的所有类的内部逻辑.即通过调用简单工厂的类方法并传递参数,然后由简单工厂创建对应的类
- 抽象产品: 简单工厂模式所创建的所有对象的父类,这里父类不一定非要接口,也可以使抽象类,它负责描述所有实例所共有的公共接口
- 具体产品:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类
具体实例
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
| public interface Operation{
public function get(); }
class OperationAdd implements Operation{ private $_NumA; private $_NumB; public function __construct($num1,$num2) { $this->_NumA = $num1; $this->_NumB = $num2; } public function get() { return ($this->_NumA + $this->_NumB); } }
class OperationSub implments Operation { private $_NumA; private $_NumB; public function __construct($num1,$num2) { $this->_NumA = $num1; $this->_NumB = $num2; } public function get() { return ($this->_NumA - $this->_NumB); } }
public class OperaFactory{ private $_results; private $_opera; public function __construct() { $this->_results = 0; } public function Calculate($num1,$num2,$operator) { swtich($operator) { case '+': $this->_opera = new OperationAdd($num1,$num2); break; case '-': $this->_opera = new OperationSub($num1,$num2); break; default: break; } $this->_results = $this->_opera->get(); return $this->_results; } }
|
优缺点
在讲述优缺点的之前,我们可以先思考一个问题,就当前的例子而言,如果我们需要添加一个 乘法的类,我们只需要定义一个类方法继承Operation这个接口,然后实现该方法,最后在OperaFactory中的Calculate中加一个新的分支
优点:
从上述例子以及简单的思考,不难看出通过简单工厂设计模式使得程序变得更加灵活,便于修改,并易于复用,降低了代码的耦合性
缺点:
如我们在代码所见那样,所有的创建逻辑都在OperaFactory中的Calculate,一旦其不能正常工作,整个系统都将收到影响