This is the First Arcticle: ABSTRACT FACTORY
Here the theory goes:
/*
The theory basis :
While using abstract factory , the situation will be almost like this:
we can create a real product from the abstract product , there are many series of product ,
and the all have the similar property and operations , the operations can be different inner,
but all the same interface outer;
What's need?
An abstract factory , and many real factory derived from this factory create real products
An abstract product , any many real product derived from this proudct ;
An abstract Interface , and many real Interface that realize the interface
*/
Here the code goes:
1
/********************************************************************
2
3
created:
4
filename:
5
file path:
6
file base:
7
file ext:
8
author:
9
10
purpose:
11
*********************************************************************/
12
13
14
#include <iostream>
15
using namespace std;
16
17
//the abstract implementation
18
class AbsProductImp
19
{
20
public:
21
virtual void DrawProductShape()=0;
22
};
23
//the abstract factory
24
class AbsFactory
25
{
26
public:
27
virtual AbsProductImp * CreateAProductImp()=0; //Create a real implement
28
};
29
30
//the abstract product
31
class AbsProduct
32
{
33
public:
34
//virtual void DrawProductShape();
35
protected:
36
AbsProductImp * _imp; //implement pointer , it's decide which implement be execute
37
AbsFactory * _Fac; // this pointer will point to the real factory
38
39
};
40
41
42
class AProductImp :public AbsProductImp //the real a product
43
{
44
public:
45
void DrawProductShape()
46
{
47
cout<<"A product is describing itself; A is implement complete "<<endl;
48
}
49
50
};
51
class BProductImp :public AbsProductImp //the real a product
52
{
53
public:
54
virtual void DrawProductShape()
55
{
56
cout<<"B product is describing itself; B is implement complete "<<endl;
57
}
58
59
};
60
61
class AFactory :public AbsFactory //The factory that create A
62
{
63
public:
64
virtual AbsProductImp * CreateAProductImp()
65
{
66
return new AProductImp;
67
}
68
69
};
70
71
class BFactory : public AbsFactory
72
{
73
public:
74
virtual AbsProductImp * CreateAProductImp()
75
{
76
return new BProductImp;
77
}
78
79
};
80
81
class AProduct :public AbsProduct
82
{
83
public:
84
AProduct()
85
{
86
_Fac=new AFactory; // specific the AFactory to create A
87
_imp=_Fac->CreateAProductImp(); // polymorphism , select the product implement
88
_imp->DrawProductShape(); //construct it self
89
}
90
};
91
92
class BProduct :public AbsProduct
93
{
94
public:
95
BProduct()
96
{
97
_Fac=new BFactory; // specific the BFactory to create B
98
_imp=_Fac->CreateAProductImp(); // polymorphism , select the product implement
99
_imp->DrawProductShape(); //construct it self
100
}
101
};
102
103
int main(int argc, char* argv[])
104
{
105
AProduct _a; //Create An AProduct
106
BProduct _b; //Create A BProduct
107
return 1;
108
}
109
110
111
112