简单工厂模式

简单工厂模式定义

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现

简单工厂的 UML 图

简单工厂模式中的各个角色以及相应职责:

  1. 简单工厂: 简单工厂模式的核心,由它负责创建所有的所有类的内部逻辑.即通过调用简单工厂的类方法并传递参数,然后由简单工厂创建对应的类
  2. 抽象产品: 简单工厂模式所创建的所有对象的父类,这里父类不一定非要接口,也可以使抽象类,它负责描述所有实例所共有的公共接口
  3. 具体产品:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类

具体实例

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,一旦其不能正常工作,整个系统都将收到影响