简单工厂模式

概述

  1. 定义:定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类

  2. 在简单工厂模式中用于被创建实例的方法通常为静态(static)方法,因此简单工厂模式又被成为静态工厂方法(Static Factory Method)

  3. 需要什么,只需要传入一个正确的参数,就可以获取所需要的对象,而无需知道其实现过程

结构

uml

其中工厂类为:TankFactory

产品类为:Tank

代码实现

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
85
86
87
#include <iostream>

using namespace std;

typedef enum
{
Tank_Type_56,
Tank_Type_96,
Tank_Type_Num
} Tank_Type;

class Tank
{
public:
virtual const string &type() = 0;
};

class Tank56 : public Tank
{
public:
Tank56() : Tank(), mstr_type("Tank56")
{
}

const string &type() override
{
cout << mstr_type.data() << endl;
return mstr_type;
}

private:
string mstr_type;
};

//具体的产品类
class Tank96 : public Tank
{
public:
Tank96() : Tank(), mstr_type("Tank96")
{
}
const string &type() override
{
cout << mstr_type.data() << endl;
return mstr_type;
}

private:
string mstr_type;
};

//工厂类
class TankFactory
{
public:
//根据产品信息创建具体的产品类实例,返回一个抽象产品类
static Tank *createTank(Tank_Type type)
{
switch (type)
{
case Tank_Type_56:
return new Tank56();
case Tank_Type_96:
return new Tank96();
default:
return nullptr;
}
}
};

int main()
{
TankFactory *factory = new TankFactory();
Tank *tank56 = factory->createTank(Tank_Type_56);
tank56->type();
Tank *tank96 = factory->createTank(Tank_Type_96);
tank96->type();

delete tank96;
tank96 = nullptr;
delete tank56;
tank56 = nullptr;
delete factory;
factory = nullptr;

return 0;
}

优缺点

优点

  1. 工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责
  2. 客户端无需知道所创建具体产品的类名,只需知道参数即可
  3. 也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类

缺点

  1. 工厂类集中了所有产品的创建逻辑,职责过重,一旦异常,整个系统将受影响
  2. 使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度
  3. 系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂
  4. 简单工厂模式使用了static工厂方法,造成工厂角色无法形成基于继承的等级结构。

简单工厂模式的适用环境

  1. 工厂类负责创建的对象比较少,因为不会造成工厂方法中的业务逻辑过于复杂
  2. 客户端只知道传入工厂类的参数,对如何创建对象不关心

简单工厂模式
https://carl-5535.github.io/2022/04/07/设计模式/工厂模式/
作者
Carl Chen
发布于
2022年4月7日
许可协议