初识设计模式——简单工厂模式(Simple Factory Pattern)

cuixiaogang

简单工厂模式(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类图

UML类图

总结

简单工厂模式主要减少了客户端代码的修改,降低了耦合性。以上述代码为例,假如现在需要扩展这个计算器,为这个计算器加一个平方根的计算功能,只需要增加一个SquareRoot类继承Claculator接口,在简单工厂中增加一条分支即可,无需改变客户端的代码。

但是设计模式的六大原则中存在一个开闭原则(Open-Closed Principle, OCP),其中的Factory显然违背了这一原则,所以简单工厂模式并不属于23种GOF设计模式之一,而工厂模式与简单工厂模式的区别主要也在这里。

On this page
初识设计模式——简单工厂模式(Simple Factory Pattern)