This is the 4Th Arcticle: Builder PATTERN
Separates the construction of a complex object from its representation so that the same construction process can create different representations. --Gof
The builder pattern can separate the representation and construction easily , while you building a big-pang object , and some of the object itself is
diversified and could be build separately , considering this pattern.
Participants:
Builder.
- specifies an abstract interface for creating parts of a Product object
ConcreteBuilder.
- constructs and assembles parts of the product by implementing the Builder interface
- defines and keeps track of the representation it creates
- provides an interface for retrieving the product
Director.
- constructs an object using the Builder interface
Product.
- represents the complex object under construction. ConcreteBuilder builds the product's internal representation and defines the process by which it's assembled
- includes classes that define the constituent parts, including interfaces for assembling the parts into the final result
The diagram goes here:
![](http://www.cppblog.com/images/cppblog_com/cxl82116/Bridge.JPG)
Code is the most clearly lauguage for out programmers , so I will use code to expree this pattern clearly as follows:
1![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
2![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//* this is the diversfied part*/
3![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
4
//abstract
5
class House
6![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
7![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
8
};
9
//abstract
10
class Door
11![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
12![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
13
};
14![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
15
//concrete, transformation
16
class FeDoor: public Door
17![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
18![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
19
};
20
//concreate, transformation
21
class WoodDoor: public Door
22![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
23![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
24
};
25![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
26
//abstract
27
class Window
28![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
29![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
30
};
31
//concreate , transformation
32
class FeWindow :public Window
33![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
34![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
35
};
36
//concreate, transformation
37
class WoodWindow :public Window
38![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
39![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
40
};
41![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
42![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//*this is the builder the stable part*/
43
class Builder
44![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
45![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
46
protected:
47
//build every part here
48
virtual void BuildeDoor();
49
virtual void BuildeWindow();
50
virtual void BuildFloor();
51
//to get the result
52
public:
53
virtual void GetHouse();
54
55
}
56![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
57
class FeHouseBuilder :public Builder
58![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
59
public:
60
GetHouse()
61![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
62![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
return /**//*window + door */
63
}
64
protected:
65
void BuildeDoor()
66![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
67
68
aDoor=new FeDoor();
69
}
70
void BuildWindow()
71![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
72
aRedWindow=new FeWindow();
73
}
74
private:
75
Window aWindow;
76
Door aDoor;
77![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
78
}
79![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
80
class WoodHouseBuilder :public Builder
81![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
82
public:
83
House GetHouse()
84![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
85![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
return /**//*window + door */
86
}
87
protected:
88
void BuildeDoor()
89![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
90
91
aDoor=new WoodDoor(); //can change
92
}
93
void BuildWindow()
94![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
95
aRedWindow=new WoodWindow(); //can change too
96
}
97
private:
98
Window aWindow;
99
Door aDoor;
100![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
101
}
102![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
103
class Director
104![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
105
public:
106
//Create a house that has two doors and a window , this is the creator part , It's usually Stable too
107
static House Construct(Builder builder)
108![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
109
builder.BuildeDoor();
110
builder.BuildeDoor();
111
builder.BuildeWindow();
112![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
113
return builder.GetHouse();
114
}
115![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
116
};
117![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
118
//client
119
int main(int argc , char * argv[])
120![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
121
//read the config file
122
//build a fe House with two doors and a window
123
Director::Construct(new FeHouseBuilder());
124
//builder a wood house with two doors and a window
125
Director::Construct(new WoodHouseBuilder());
126![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
127![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//*two doors and a window is stable , and the house 's architecture is stable too ,but the material*/
128![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
129
}
1-40 is the diversification , the house's architecture is stable , you create a mixed house easily if you like , simply add a class called mixedhouseBuidler and use the right part(like the FeDoor and WoodDoor ) to create the mixed house ,and use the mixedHouseBuilder to builde you work.
simple and practible!