Posted on 2009-06-13 12:00
sufan 阅读(331)
评论(0) 编辑 收藏 引用 所属分类:
转载
相对前一篇来说,这一篇中所涉及的例子程序,在使用抽象工厂方法的前后进行了一个比较,我们能发现的是:在使用抽象工厂方法之后,程序的实现显得更加优雅。
这是原来的:
1 #define MOTIF
2
3 class Widget {
4 public:
5 virtual void draw() = 0;
6 };
7
8 class MotifButton : public Widget {
9 public:
10 void draw() { cout << "MotifButton\n"; }
11 };
12 class MotifMenu : public Widget {
13 public:
14 void draw() { cout << "MotifMenu\n"; }
15 };
16
17 class WindowsButton : public Widget {
18 public:
19 void draw() { cout << "WindowsButton\n"; }
20 };
21 class WindowsMenu : public Widget {
22 public:
23 void draw() { cout << "WindowsMenu\n"; }
24 };
25
26 void display_window_one() {
27 #ifdef MOTIF
28 Widget* w[] = { new MotifButton,
29 new MotifMenu };
30 #else // WINDOWS
31 Widget* w[] = { new WindowsButton,
32 new WindowsMenu };
33 #endif
34 w[0]->draw(); w[1]->draw();
35 }
36
37 void display_window_two() {
38 #ifdef MOTIF
39 Widget* w[] = { new MotifMenu,
40 new MotifButton };
41 #else // WINDOWS
42 Widget* w[] = { new WindowsMenu,
43 new WindowsButton };
44 #endif
45 w[0]->draw(); w[1]->draw();
46 }
47
48 int main() {
49 #ifdef MOTIF
50 Widget* w = new MotifButton;
51 #else // WINDOWS
52 Widget* w = new WindowsButton;
53 #endif
54 w->draw();
55 display_window_one();
56 display_window_two();
57 }
输出为:
MotifButton
MotifButton
MotifMenu
MotifMenu
MotifButton
下面是使用抽象工厂方法后的程序:
1 #define WINDOWS
2
3 class Widget {
4 public:
5 virtual void draw() = 0;
6 };
7
8 class MotifButton : public Widget {
9 public:
10 void draw() { cout << "MotifButton\n"; }
11 };
12 class MotifMenu : public Widget {
13 public:
14 void draw() { cout << "MotifMenu\n"; }
15 };
16
17 class WindowsButton : public Widget {
18 public:
19 void draw() { cout << "WindowsButton\n"; }
20 };
21 class WindowsMenu : public Widget {
22 public:
23 void draw() { cout << "WindowsMenu\n"; }
24 };
25
26 class Factory {
27 public:
28 virtual Widget* create_button() = 0;
29 virtual Widget* create_menu() = 0;
30 };
31
32 class MotifFactory : public Factory {
33 public:
34 Widget* create_button() {
35 return new MotifButton; }
36 Widget* create_menu() {
37 return new MotifMenu; }
38 };
39
40 class WindowsFactory : public Factory {
41 public:
42 Widget* create_button() {
43 return new WindowsButton; }
44 Widget* create_menu() {
45 return new WindowsMenu; }
46 };
47
48 Factory* factory;
49
50 void display_window_one() {
51 Widget* w[] = { factory->create_button(),
52 factory->create_menu() };
53 w[0]->draw(); w[1]->draw();
54 }
55
56 void display_window_two() {
57 Widget* w[] = { factory->create_menu(),
58 factory->create_button() };
59 w[0]->draw(); w[1]->draw();
60 }
61
62 int main() {
63 #ifdef MOTIF
64 factory = new MotifFactory;
65 #else // WINDOWS
66 factory = new WindowsFactory;
67 #endif
68
69 Widget* w = factory->create_button();
70 w->draw();
71 display_window_one();
72 display_window_two();
73 }
同样的在最后的输出:
WindowsButton
WindowsButton
WindowsMenu
WindowsMenu
WindowsButton