一、简介:
1、建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2、建造者模式通常包括下面几个角色:
(1)builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。
(2)ConcreteBuilder:继承builder类,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
(3)Director:控制建造过程,用来隔离用户与建造过程的关联。
(4)Product:要创建的复杂对象。
个人感觉建造者模式有点像是像是工厂模式和策略模式的一个综合,先用builder生产product,然后用Director来指挥隔离与用户的耦合程度。
3、举例:设计一个设置游戏人物脸部特征的程序,其中眼睛、耳朵、鼻子、嘴、眉毛都是可以设置的Product
4、UML
5、所属类别:创建型
二、C++程序
1 // 设计模式.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include<iostream>
6 #include<string>
7 using namespace std;
8 //产品类
9 class Product
10 {
11 private:
12 string brow;
13 string eyes;
14 //string ears;
15 //string nose;
16 //string mouse;
17 public:
18 Product(){}
19 ~Product(){}
20 void set_brow(string b)
21 {
22 brow=b;
23 }
24 void set_eyes(string e)
25 {
26 eyes=e;
27 }
28 void show()
29 {
30 cout<<brow<<endl;
31 cout<<eyes<<endl;
32 }
33 };
34 //抽象建造者类
35 class Builder
36 {
37 public:
38 Builder(){}
39 virtual ~Builder(){}
40 virtual void build_brow()=0;
41 virtual void build_eyes()=0;
42 virtual Product * getresult()=0;
43 };
44 //具体造者类1
45 class Conbuilder1:public Builder
46 {
47 private:
48 Product* product;
49 public:
50 Conbuilder1()
51 {
52 product=new Product();
53 }
54 virtual ~Conbuilder1(){}
55 virtual void build_brow()
56 {
57 product->set_brow("浓眉");
58 }
59 virtual void build_eyes()
60 {
61 product->set_eyes("丹凤眼");
62 }
63 virtual Product * getresult()
64 {
65 return product;
66 }
67 };
68 //具体造者类2
69 class Conbuilder2:public Builder
70 {
71 private:
72 Product* product;
73 public:
74 Conbuilder2()
75 {
76 product=new Product();
77 }
78 virtual ~Conbuilder2(){}
79 virtual void build_brow()
80 {
81 product->set_brow("柳叶眉");
82 }
83 virtual void build_eyes()
84 {
85 product->set_eyes("三角眼");
86 }
87 virtual Product * getresult()
88 {
89 return product;
90 }
91 };
92 //指挥者
93 class Director
94 {
95 public:
96 Director(Builder * builder)
97 {
98 builder->build_brow();
99 builder->build_eyes();
100 }
101 ~Director(){}
102 };
103 int _tmain(int argc, _TCHAR* argv[])
104 {
105 Conbuilder1 *conbuilder1=new Conbuilder1();
106 Director *director=new Director(conbuilder1);
107 Product * product1=conbuilder1->getresult();
108 product1->show();
109 return 0;
110 }