设计模式第三弹,抽象工厂模式

"设计模式"

Posted by hbl on 2017-04-24

设计模式第三弹,抽象工厂模式

在抽象工厂模式中,将产品分为产品族和产品等级结构,每一个具体的工厂不再是具体到每一个产品,二是具体到产品族上,产品族是指由同一个工厂生产,位于不同的产品等级结构中。产品等级结构即是产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族的所有对象时,抽象工厂模式比工厂方法模式更为简单,更为有效率。
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。在抽象工厂模式中,每一个具体的工厂都提供了多个工厂方法用于生产多种不同类型的产品,这些产品构成了一个产品族。
思考:抽象工厂模式是否符合开闭原则?
答:从增加产品等级结构先说,不符合开闭原则,增加一个产品等级结构就要在原有的工厂中,添加新的方法,从增加产品族的方面来说,符合开闭原则。
开闭原则的倾斜性:在抽象工厂模式中,增加新的产品族很方便,但是增加新的产品等级结构很麻烦,抽象工厂模式中的这种性质为”开闭原则的倾斜性”。
练习:分析产品族和产品等级结构分别指的是什么?要求具有加号的扩展性以支持新的操作系统平台,考虑到抽象工厂模式的对开闭原则的倾斜性,所以以两个游戏控制为产品族,系统为产品等级结构。

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
public abstract class AbstractFactory {
abstract GameController creatOperation();
abstract GameController creatInterface();
}
class WindowPhoneFactory extends AbstractFactory{
@Override
GameController creatOperation() {
System.out.println("创建window手机的游戏操作控制类");
return new OperationWController();
}
@Override
GameController creatInterface() {
System.out.println("创建window手机的游戏界面控制类");
return new InterfaceWController();
}
}
class SymbianFactory extends AbstractFactory{
@Override
GameController creatOperation() {
System.out.println("创建Symbian手机的游戏操作控制类");
return new OperationSController();
}
@Override
GameController creatInterface() {
System.out.println("创建Symbian手机的游戏界面控制类");
return new InterfaceSController();
}
}
class AndroidFactory extends AbstractFactory{
@Override
GameController creatOperation() {
System.out.println("创建Android手机的游戏操作控制类");
return new OperationAController();
}
@Override
GameController creatInterface() {
System.out.println("创建Android手机的游戏界面控制类");
return new InterfaceAController();
}
}
public abstract class GameController {
abstract void control();
}
class OperationWController extends GameController{
@Override
void control() {
System.out.println("进行window游戏操作控制");
}
}
class InterfaceWController extends GameController{
@Override
void control() {
System.out.println("进行widnow游戏界面控制");
}
}
class OperationSController extends GameController{
@Override
void control() {
System.out.println("进行Symbain游戏操作控制");
}
}
class InterfaceSController extends GameController{
@Override
void control() {
System.out.println("进行Symbain游戏界面控制");
}
}
class OperationAController extends GameController{
@Override
void control() {
System.out.println("进行Android游戏操作控制");
}
}
class InterfaceAController extends GameController{
@Override
void control() {
System.out.println("进行Android游戏界面控制");
}
}
public static void main(String[] arg){
WindowPhoneFactory factory=new WindowPhoneFactory();
GameController interfaceWController = factory.creatInterface();
GameController operationWController = factory.creatOperation();
interfaceWController.control();
operationWController.control();
//
SymbianFactory sfactory=new SymbianFactory();
GameController sinterfaceWController = factory.creatInterface();
GameController soperationWController = factory.creatOperation();
sinterfaceWController.control();
soperationWController.control();
//
AndroidFactory afactory=new AndroidFactory();
GameController ainterfaceWController = factory.creatInterface();
GameController aoperationWController = factory.creatOperation();
ainterfaceWController.control();
aoperationWController.control();
}

也不知道自己写的对不对,脑子有点乱。