设计形式(3) –建造者模式(Builder)
建造者模式,也属于创建型模式。
建造者顾名思义就是一个产品(建筑)实现的经手人,他们经过一系列统一的操作去完成一个作品,完成一个什么样的产品和他的建造者密不可分。打个比方现在老李家现在有一块地可以用于建筑用地,可以用来盖个超市也可以用来建造一个别墅,老李的两个儿子都是建筑师,于是他叫来了两个儿子让他们各自设计一套从打地基到装修的完整的房子建造方案让他看看想采用谁的。
老李的儿子设计出的产品:
代码表现如下:
class CBuildingBase { public: virtual void Foundation()=0; //地基 virtual void Struction()=0; //房屋结构 virtual void Fitment()=0; //装修 }; class CBuildingLee1:public CBuildingBase { public: virtual void Foundation() { cout <<" 水泥地基"<<endl; } virtual void Struction() { cout <<" 别墅"<<endl; } virtual void Fitment() { cout <<" 欧洲风\n"<<endl; } }; class CBuildingLee2:public CBuildingBase { public: virtual void Foundation() { cout <<" 钢筋混凝地基"<<endl; } virtual void Struction() { cout <<" 商业用房"<<endl; } virtual void Fitment() { cout <<" 中国风\n"<<endl; } };
当老李打算要建房子的时候,只需依赖抽象的建筑蓝图,而实际建造时可以使用不同的实例,就可以建造出他想要的房子了。这也是其之所以命为Builder的原因。
// 决策者 -- 老李 class CDirectorLee { public: CDirectorLee(){ m_pBuild =NULL;} void SetBuild(CBuildingBase *pBulider) { if (pBulider == NULL) { return; } m_pBuild=pBulider; } void Construct() { m_pBuild->Foundation(); m_pBuild->Struction(); m_pBuild->Fitment(); } ~CDirectorLee(){}; private: CBuildingBase *m_pBuild; };
输出:
建造者模式通常用于一个比较复杂的类,为了将他解耦,我们将他分割成不同的模块来构成,通过相同的接口(打地基–>建房子 --> 装修)不同实现方式来构建一个具有一般性的整体(房子)。当然例子比较简单,实际设计中我们可能会传入参数来表达需要什么样的砖块啊之类的来达到实际生产效果。
Builder模式和AbstractFactory模式在功能上很相似,因为都是用来创建大的复杂的对象,它们的区别是:Builder模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的结果对象,一般来说Builder模式中对象不是直接返回的。而在AbstractFactory模式中对象是直接返回的,AbstractFactory模式强调的是为创建多个相互依赖的对象提供一个同一的接口。
转载请注明来自:http://blog.csdn.net/zerolxl