0%

工厂模式

工厂模式

工厂模式保护简单工厂模式、工厂方法模式、抽象工厂模式

简单工厂模式

简单工厂模式简介

  • 一个抽象产品类,根据这个抽象产品类可派生出多个具体产品类
  • 一个具体工厂类,具体工厂类用于生产多个具体产品类

代码示例

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
class GUIDrawable {
public:
virtual void draw() = 0;
};

class Button: public GUIDrawable {
public:
virtual void draw() override {
//draw button code here
}
};

class CheckBox: public GUIDrawable {
public:
virtual void draw() override {
//draw check box code here
}
};

enum GUIType {
GUITypeButton,
GUITypeCheckBox,
};

class GUIFactory {
public:
GUIDrawable* create(GUIType type) {
switch (type) {
case GUITypeButton:
return new Button();
case GUITypeCheckBox:
return new CheckBox();
default:
return nullptr;
}
}
};

工厂方法模式

工厂方法模式简介

  • 一个抽象产品类,根据这个抽象产品类可派生出多个具体产品类
  • 一个抽象工厂类,可以派生出多个具体工厂类
  • 每个具体工厂只能创建一个具体产品

代码示例

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
class GUIDrawable {
public:
virtual void draw() = 0;
};

class Button: public GUIDrawable {
public:
virtual void draw() override {
//draw button code here
}
};

class CheckBox: public GUIDrawable {
public:
virtual void draw() override {
//draw check box code here
}
};

class GUIDrawableFactory {
public:
virtual GUIDrawable* create() = 0;
};

class ButtonFactory {
public:
virtual GUIDrawable* create() override {
return new Button();
}
};

class CheckBoxFactory {
virtual GUIDrawable* create() override {
return new CheckBox();
}
};

抽象工厂模式

抽象工厂模式简介

  • 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类
  • 一个抽象工厂类,可以派生出多个具体工厂类
  • 每个具体工厂可以创建多个具体产品

代码样例

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
class GUIDrawable {
public:
virtual void draw() = 0;
};

class Button: public GUIDrawable {
public:
virtual void clicked() = 0;
};

class CheckBox: GUIDrawable {
public:
virtual void checked() = 0;
};

class WinButton: Button {
public:
virtual void draw() override {
//draw win button code
}

virtual void clicked() override {

}
};

class WinCheckBox: CheckBox {
public:
virtual void draw() override {
//draw win label code
}

virtual void checked() override {

}
};

class MacButton: Button {
public:
virtual void draw() override {
//draw mac button code here
}

virtual void clicked() override {

}
};

class MacCheckBox: CheckBox {
public:
virtual void draw() override {
//draw mac label code here
}

virtual void checked() override {

}
};

class GUIFactory {
public:
virtual Button* createButton() = 0;
virtual CheckBox* createCheckBox() = 0;
};

class WinGUIFactory : public GUIFactory {
public:
virtual Button* createButton() override {
return new WinButton();
}

virtual CheckBox* createCheckBox() override {
return new WinCheckBox();
}
};

class MacGUIFactory: public GUIFactory {
public:
virtual Button* createButton() override {
return new MacButton();
}

virtual CheckBox* createLabel() override {
return new MacCheckBox();
}
};

总结

在许多设计工作的初期都会使用简单工厂模式,随后演化为使用工厂方法模式, 随后演化为使用抽象工厂模式,甚至继续演化为使用原型模式或生成器模式。