

1 #include <iostream>
2 #include <string>
3
4 using namespace std;
5
6
7 class STAbstractProductA
8 {
9 public:
10 virtual void use() = 0;
11 };
12
13 class STProductA1: public STAbstractProductA
14 {
15 public:
16 virtual void use()
17 {
18 cout<< "use ProductA1............"<< endl;
19 }
20 };
21
22 class STProductA2: public STAbstractProductA
23 {
24 public:
25 virtual void use()
26 {
27 cout<< "use ProductA2............"<< endl;
28 }
29 };
30
31 class STAbstractProductB
32 {
33 public:
34 virtual void eat() = 0;
35 };
36
37 class STProductB1: public STAbstractProductB
38 {
39 public:
40 virtual void eat()
41 {
42 cout<< "eat ProductB1............"<< endl;
43 }
44 };
45
46 class STProductB2: public STAbstractProductB
47 {
48 public:
49 virtual void eat()
50 {
51 cout<< "eat ProductB2............"<< endl;
52 }
53 };
54
55 class STAbstractFactory
56 {
57 public:
58 virtual STAbstractProductA* CreateProductA() = 0;
59 virtual STAbstractProductB* CreateProductB() = 0;
60 };
61
62 class STConcreteFactoryA: public STAbstractFactory
63 {
64 public:
65 virtual STAbstractProductA* CreateProductA()
66 {
67 return new STProductA1;
68 }
69 virtual STAbstractProductB* CreateProductB()
70 {
71 return new STProductB1;
72 }
73 };
74
75 class STConcreteFactoryB: public STAbstractFactory
76 {
77 public:
78 virtual STAbstractProductA* CreateProductA()
79 {
80 return new STProductA2;
81 }
82 virtual STAbstractProductB* CreateProductB()
83 {
84 return new STProductB2;
85 }
86 };
87
88 int main(int argc, char* argv[])
89 {
90 STAbstractFactory* fc = new STConcreteFactoryA();
91 STAbstractProductA* pa = fc->CreateProductA();
92 STAbstractProductB* pb = fc->CreateProductB();
93
94 pa->use();
95 pb->eat();
96
97 STAbstractFactory* fc2 = new STConcreteFactoryB();
98 STAbstractProductA* pa2 = fc2->CreateProductA();
99 STAbstractProductB* pb2 = fc2->CreateProductB();
100
101 pa2->use();
102 pb2->eat();
103
104 return 0;
105 }
106 ////////////////////////////////////////
107 [root@ ~/learn_code/design_pattern/9_abstract_factory]$ ./abstract_factory
108 use ProductA1............
109 eat ProductB1............
110 use ProductA2............
111 eat ProductB2............