设计模式笔记:抽象工厂模式

抽象工厂模式

定义:将有关联关系的系列产品放到一个工厂里,通过该工厂生产一系列产品。

设计模式有三大分类:创建型模式、结构型模式、行为型模式
抽象工厂模式属于创建型模式

上篇 工厂方法模式 提到工厂方法模式中每个工厂只生产一种特定的产品,这样会有工厂类太多的问题,不容易维护。现实生活中,小米工厂除了生产手机还可能生产有关联的平板电脑,即一个工厂会生产多个有关联关系的系列产品,这种方式即抽象工厂模式。
比如:
小米工厂生产 小米手机小米平板电脑
华为工厂生产 华为手机华为平板电脑

故事铁蛋所在的富士康公司接到了为小米和华为代工手机和平板的任务,这个重任交给了打工人铁蛋,铁蛋是超级厉害的,铁蛋使用了抽象工厂模式解决了该问题。

铁蛋是怎么做的呢?他是这样做的:
一、定义手机相关的类(手机基类Phone、XiaomiPhone、HuaweiPhone)
二、定义平板相关的类(平板基类Computer 、XiaomiComputer 、HuaweiComputer)
三、定义工厂相关的类(工厂基类AbstractFactory、XiaomiFactory、HuaweiFactory)
如下:

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include <iostream>
#include <string>
using namespace std;

// 手机基类
class Phone {
public:
Phone(string name) : name_(name) {}
virtual void InstallPhoSystemOperation() = 0;

protected:
string name_;
};
// 小米手机类
class XiaomiPhone : public Phone {
public:
XiaomiPhone(string name) : Phone(name)
{
cout << "获得一部小米手机: " << name << endl;
}
void InstallPhoSystemOperation() {
cout << "为小米手机安装系统" << endl;
}
};
// 华为手机类
class HuaweiPhone : public Phone {
public:
HuaweiPhone(string name) : Phone(name)
{
cout << "获得一部华为手机: " << name << endl;
}
void InstallPhoSystemOperation() {
cout << "为华为手机安装系统" << endl;
}
};

// 平板基类
class Computer {
public:
Computer(string name) : name_(name) {}
virtual void InstallComSystemOperation() = 0;

protected:
string name_;
};
// 小米平板类
class XiaomiComputer : public Computer {
public:
XiaomiComputer(string name) : Computer(name)
{
cout << "获得一个小米平板: " << name << endl;
}
void InstallComSystemOperation() {
cout << "为小米《平板》安装系统" << endl;
}
};
// 华为平板类
class HuaweiComputer : public Computer {
public:
HuaweiComputer(string name) : Computer(name)
{
cout << "获得一个华为平板: " << name << endl;
}
void InstallComSystemOperation() {
cout << "为华为《平板》安装系统" << endl;
}
};

// 抽象工厂接口
class AbstractFactory {
public:
virtual Phone* CreatePhone(string name) = 0;
virtual Computer* CreateComputer(string name) = 0;
};
// 小米工厂
class XiaomiFactory : public AbstractFactory {
public:
Phone* CreatePhone(string name)
{
return new XiaomiPhone(name);
}
Computer* CreateComputer(string name)
{
return new XiaomiComputer(name);
}
};
// 华为工厂
class HuaweiFactory : public AbstractFactory {
public:
Phone* CreatePhone(string name)
{
return new HuaweiPhone(name);
}
Computer* CreateComputer(string name)
{
return new HuaweiComputer(name);
}
};

int main()
{
cout << "------抽象工厂模式------" << endl;
// 创建小米工厂
AbstractFactory* xiaomiFactory = new XiaomiFactory();
// 创建华为工厂
AbstractFactory* huaweiFactory = new HuaweiFactory();

//生产小米手机和小米平板
Phone* xiaomiPhone = xiaomiFactory->CreatePhone("小米11");
Computer* xiaomiComputer = xiaomiFactory->CreateComputer("平板《MI》");

//为小米手机和小米平板安装操作系统
xiaomiPhone->InstallPhoSystemOperation();
xiaomiComputer->InstallComSystemOperation();

//生产华为手机和华为平板
Phone* huaweiPhone = huaweiFactory->CreatePhone("华为mate60");
Computer* huaweiComputer = huaweiFactory->CreateComputer("平板《huawei》");

//为华为手机和华为平板安装操作系统
huaweiPhone->InstallPhoSystemOperation();
huaweiComputer->InstallComSystemOperation();

delete xiaomiPhone;
delete xiaomiComputer;
delete huaweiPhone;
delete huaweiComputer;
delete xiaomiFactory;
delete huaweiFactory;
return 0;
}

运行结果:

利用抽象工厂模式成功创建两个工厂,成功分别生产小米手机平板 和 华为手机平板


谢谢观看,祝顺利!

参考 https://shusheng007.top/2020/02/16/abstract-factory-pattern/

作者:张泽中