抽象工厂模式的定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。
抽象工厂模式的通用类图
抽象工厂是工厂方法模式的升级版本,在多个业务品种、业务分类时,通过抽象工厂模式生产所需要的对象是一种非常好的方式。所以理论上讲,工厂模式能做的事抽象工厂模式来做也没有问题,高版本兼容低版本嘛~
女娲造人后传
女娲造人之后发现造出来的人太单调了,因为忘记给人类定义性别了。那现在我们给人类加上性别。其实这里就是一个添加业务品种的过程。
见代码
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
|
//人类接口
public
interface
Human {
public
void
getColor();
public
void
talk();
public
void
getSex();
}
//白色人种
public
abstract
class
AbstractWhiteHuman
implements
Human {
public
void
getColor(){
System.out.println(
"白色人种的皮肤都是白色的"
);
}
public
void
talk(){
System.out.println(
"白种人说话,一般说的都是单子节"
);
}
}
//黑色人种
public
abstract
class
AbstractBlackHuman
implements
Human {
public
void
getColor() {
System.out.println(
"黑色人种的皮肤颜色是黑色的!"
);
}
public
void
talk() {
System.out.println(
"黑人说话,一般人都听不懂。"
);
}
}
//黄色人种
public
abstract
class
AbstractYellowHuman
implements
Human {
public
void
getColor(){
System.out.println(
"黄种人的皮肤是黄色的"
);
}
public
void
talk(){
System.out.println(
"黄种人说话一般都是双字节的"
);
}
}
|
每一个种类都会再有两个实现类,举例黄色人种
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
|
//女性
public
class
FemaleYellowHuman
extends
AbstractYellowHuman{
public
void
getSex(){
System.out.println(
"黄种人女性"
);
}
}
//男性
public
class
maleYellowHuman
extends
AbstractYellowHuman{
public
void
getSex(){
System.out.println(
"黄种人男性"
);
}
}
//工厂接口
public
interface
HumanFactory {
public
Human createBlaclHuman();
public
Human createYellowHuman();
public
Human createWhiteHuman();
}
//女性工厂
public
class
FemaleHumanFactory
implements
HumanFactory{
public
Human createBlackHuman(){
return
new
FemaleBlackHuman();
}
...
//同上
}
//男性工厂
public
class
MaleHumanFactory
implements
HumanFactory{
public
Human createBlackHuman(){
return
new
MaleBlackHuman();
}
...
//同上
}
//女娲重造人类场景类
public
class
NvWa{
//要造人首先得有工厂
HumanFactory maleHumanFactory =
new
MaleFactory();
HumanFactory femaleHumanFactory =
new
FemaleFactory();
//开始造人
Human maleYellowHuman = maleHumanFactory.createYellowHuman();
Human femaleYellowHuman = femaleHumanFactory.createYellowHuman();
}
}
|
我理解的抽象工厂:
1、当业务类别产生时,我们使用工厂模式的升级版本—-抽象工厂模式,可以使代码逻辑十分清楚。
2、同时当业务类别特别多时,如果我们使用工厂模式,那我们就需要记住每个要产生的对象的名字(或指定的字符串),这对于团队来说是很不合理的,A写的代码B需要再去看一遍;但是如果使用抽象工厂就会有代码提示~这个我们肯定有体会
抽象工厂模式也有通用代码,根据上面的UML图可以很简单的得出来~
抽象工厂模式的优点
-
封装性,每个产品的实现类不是高层模块要关心的,它要关心的是接口和抽象,它不关心对象是如何创造的。
-
产品族的约束是非公开的,比如我生产一个左轮胎就需要生产一个右轮胎。这个是在工厂内默认的,高层模块根本不需要关心这个。
抽象工厂模式的缺点
-
产品族的拓展性非常差,如果人类再有一种肤色X,那上面的HumanFactory就需要修改,然后它的两个实现类也需要修改,这严重违反了开闭原则