设计模式之创建型设计模式-抽象工厂模式

1. 模式简介

提供一个创建一系列相关或者相互依赖对象的接口,无须指定具体的类,属于创建型设计模式

2. 示例代码

  • 产品抽象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 手机产品抽象类
public abstract class Phone {
/**
* 描述
*/
public abstract void describe();
}

// 笔记本产品抽象类
public abstract class Laptop {
/**
* 描述
*/
public abstract void describe();
}

// 耳机产品抽象类
public abstract class EarPhone {
/**
* 描述
*/
public abstract void describe();
}
  • 科技公司工厂抽象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 科技公司抽象工厂类
public abstract class TechFactory {
/**
* 卖手机
*
* @return 手机
*/
public abstract Phone sellPhone();

/**
* 卖笔记本
*
* @return 笔记本
*/
public abstract Laptop sellLaptop();

/**
* 卖耳机
*
* @return 耳机
*/
public abstract EarPhone sellEarPhone();
}
  • 统一品牌产品的具体实现 / 科技公司的具体实现
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198

// 小米品牌小米手机具体实现
public class MiPhone extends Phone {
/**
* 描述
*/
@Override
public void describe() {
System.out.println("小米手机");
}
}

// 小米品牌小米笔记本具体实现
public class MiLaptop extends Laptop{
/**
* 描述
*/
@Override
public void describe() {
System.out.println("小米笔记本");
}
}

// 小米品牌小米耳机具体实现
public class MiEarPhone extends EarPhone {
/**
* 描述
*/
@Override
public void describe() {
System.out.println("小米耳机");
}
}

// 小米公司工厂具体实现
public class MiTechCompany extends TechFactory {
/**
* 卖手机
*
* @return 手机
*/
@Override
public Phone sellPhone() {
return new MiPhone();
}

/**
* 卖笔记本
*
* @return 笔记本
*/
@Override
public Laptop sellLaptop() {
return new MiLaptop();
}

/**
* 卖耳机
*
* @return 耳机
*/
@Override
public EarPhone sellEarPhone() {
return new MiEarPhone();
}
}

// 华为品牌华为手机具体实现
public class HuaweiPhone extends Phone {
/**
* 描述
*/
@Override
public void describe() {
System.out.println("华为手机");
}
}

// 华为品牌华为笔记本具体实现
public class HuaweiLaptop extends Laptop{
/**
* 描述
*/
@Override
public void describe() {
System.out.println("华为笔记本");
}
}

// 华为品牌华为耳机具体实现
public class HuaweiEarPhone extends EarPhone {
/**
* 描述
*/
@Override
public void describe() {
System.out.println("华为耳机");
}
}

// 华为公司工厂具体实现
public class HuaweiTechCompany extends TechFactory {
/**
* 卖手机
*
* @return 手机
*/
@Override
public Phone sellPhone() {
return new HuaweiPhone();
}

/**
* 卖笔记本
*
* @return 笔记本
*/
@Override
public Laptop sellLaptop() {
return new HuaweiLaptop();
}

/**
* 卖耳机
*
* @return 耳机
*/
@Override
public EarPhone sellEarPhone() {
return new HuaweiEarPhone();
}
}

// 苹果品牌苹果手机具体实现
public class IPhone extends Phone {
/**
* 描述
*/
@Override
public void describe() {
System.out.println("IPhone");
}
}

// 苹果品牌苹果笔记本具体实现
public class MacBookPro extends Laptop{
/**
* 描述
*/
@Override
public void describe() {
System.out.println("MacBookPro");
}
}

// 苹果品牌苹果耳机具体实现
public class AirPod extends EarPhone {
/**
* 描述
*/
@Override
public void describe() {
System.out.println("AirPod");
}
}

// 苹果公司工厂具体实现
public class AppleTechCompany extends TechFactory {
/**
* 卖手机
*
* @return 手机
*/
@Override
public Phone sellPhone() {
return new IPhone();
}

/**
* 卖笔记本
*
* @return 笔记本
*/
@Override
public Laptop sellLaptop() {
return new MacBookPro();
}

/**
* 卖耳机
*
* @return 耳机
*/
@Override
public EarPhone sellEarPhone() {
return new AirPod();
}
}

3. UML图例

抽象工厂模式UML图

4. 应用

1
2
// Spring 源码
// AbstractBeanFactory -> AbstractAutowireCapableBeanFactory / DefaultListableBeanFactory / XmlBeanFactory

5. 场景

  • 客户端不依赖产品类,不关注创建、实现的细节
  • 强调一系列产品对象(产品族),一起创建时需要大量创建代码
  • 提供一类产品的库,所有的产品以同样的接口出现,从而使客户端不依赖具体实现

6. 优缺点

优点: 具体产品在应用层代码隔离,不关心创建细节;将一系列的产品族对象统一在一起创建

缺点: 添加一种新的产品的时候,需要在工厂接口及其工厂子类都添加实现,不符合开闭原则;增加了系统的抽象性和理解难度

7. 完整代码地址

https://github.com/xkcoding/design-pattern/tree/master/src/main/java/com/xkcoding/design/pattern/creational/abstractfactory

-------------本文结束  感谢您的阅读-------------
xkcoding wechat
欢迎来我的公众号「xkcoding小凯扣丁」逛逛
o(╯□╰)o 赞助一杯咖啡 ~~