一、简介:
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 }