0%

工厂模式之简单工厂模式(静态工厂模式)-创建型

在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类(接口)。

具有产品接口、产品实现、工厂实现。没有工厂接口。

简单工厂模式用于生产静态或独立的产品。

优点

将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易

在调用工厂类的工厂方法时,使用起来方便,如果工厂方法是静态方法,可通过类名直接调用。或者只需要传入简单的参数即可。在实际开发中,还可以在调用时将所传入的参数保存在配置文件中,修改参数时无须修改任何源代码

缺点

工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。

工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,或者增加一个静态方法,或者增加一个参数,这一点与开闭原则是相违背的。

适用

工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。

客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。

应用

JDK 加密算法

MessageDigest md = MessageDigest.getInstance(“MD5”);

PHP 示例

零件工厂 PartFactory 负责返回具体零件产品(发动机Engine、车轮Wheel)的实例。

零件有个统一的接口,和一个统一的方法 produce()

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
<?php
/**
* Interface Part
*/
interface Part
{
public function produce();
}

/**
* Class Engine
*/
class Engine implements Part
{
public function produce()
{
echo '生产发动机';
echo PHP_EOL;
}
}

/**
* Class Wheel
*/
class Wheel implements Part
{
public function produce()
{
echo '生产车轮';
echo PHP_EOL;
}
}

/**
* Class PartFactory
*/
class PartFactory
{
public function part($class)
{
switch($class){
case 'Wheel':
return new Wheel();
case 'Engine':
return new Engine();
}
}
}

/**
* Class PartStaticFactory
*/
abstract class PartStaticFactory
{
public static function Wheel()
{
return new Wheel();
}

public static function Engine()
{
return new Engine();
}
}

$buttonFactory = new PartFactory();
$buttonFactory->part('Wheel')->produce();
$buttonFactory->part('Engine')->produce();

PartStaticFactory::Wheel()->produce();
PartStaticFactory::Engine()->produce();