建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示。
建造者模式的优点是:使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以如要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
解决问题:主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但是对象内部的构建通常面临着复杂的变化。
职责 Product类:具体的产品。
Director类:指挥者,构建一个使用Builder接口的对象。
Builder接口:是为创建一个Product对象的各个组件指定的抽象接口
ConcreteBuilder类:具体的建造者,实现Builder接口,构造和装配各个部
分析
1. 生成器(Builder)模式是一步步构建一个复杂的产品,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们,用户不知道内部的具体构建细节。
2. Builder基类创建复杂产品(Product)全过程的抽象基类。Builder基类提供若干个构造部件(BuildPart)的方法(基类提供缺省实现)。具体构建产品的过程由ConcreteBuilder实现,GetResult()是获取构造完成后的对象(该方法并不在基类中!因为产品Product一般没有抽象基类。如果产品有抽象基类,GetResult就可以放在基类里)。
3. Director在构造函数中调用Builder的构造部件方法,当最后一个部件方法调用完成后,就产生了一个复杂的产品。Director的作用是封装一个产品的各个部件装配过程。
4. Builder基类将公共的部分提取出来,各个部件方法(BuildPart)由子类扩展实现。
5. Director中聚合了Builder基类指针,这样可以适应不同的具体构建者。
实现要点
1. 生成器模式将构建复杂对象的部件和构建过程(算法)解耦。生产一辆汽车的部件有车轮、发动机等等,装配一辆汽车的过程是很复杂的。应用Builder模式,生产部件(Builder.BuilderPart方法)和汽车装配过程(Director角色)是可以分开的。
2. 生成器模式构建的对象,部件可以不同,但构建过程是一样的。不同品牌的汽车生产流程相同,但由于部件的差别导致品牌地位差异。
3. 生成器模式与抽象工厂模式都是创建复杂对象,他们之间的差别比较:
Builder模式强调的是一步步构建一个复杂的对象。Abstract Factory强调多个系列的产品对象,并不关注复杂性。
Builder是生成若干个组件后,最后一步返回对象。Abstract Factory是立即返回对象的。
转载自http://blog.csdn.net/woods2001/article/details/6656863,感谢作者的辛勤劳动
如有任何不同的见解,请留言,如果在下还会喘气,会尽快给您答复
示例代码
// 计程车
class CTaxi
{
public:
string sEngine;
string sWheel;
string sTaximeter;
};
// 宝马
class CBMW
{
public:
string sEngine;
string sWheel;
};
// 建造者基类
class CBuilder
{
public:
// 发动机
virtual void BuildEngine() = 0;
// 车轮
virtual void BuildWheel() = 0;
// 计价器(计程车专有)
virtual void BuildTaximeter() = 0;
};
// 计程车建造者
class CtaxiBuilder:public CBuilder
{
public:
CtaxiBuilder::CtaxiBuilder()
{
m_texi = new CTaxi;
}
public:
virtual void BuildEngine()
{
m_texi->sEngine = "Build taxi Engine";
}
virtual void BuildWheel()
{
m_texi->sWheel = "Build taxi Wheel";
}
virtual void BuildTaximeter()
{
m_texi->sTaximeter = "Build taxi Taximeter";
}
CTaxi* GetTaxi()
{
return m_texi;
}
private:
CTaxi* m_texi;
};
// 宝马建造者
class CBMWBuilder:public CBuilder
{
public:
CBMWBuilder::CBMWBuilder()
{
m_BMW = new CBMW;
}
public:
virtual void BuildEngine()
{
m_BMW->sEngine = "Build BMW Engine";
}
virtual void BuildWheel()
{
m_BMW->sWheel = "Build BMW Wheel";
}
virtual void BuildTaximeter()
{
// NONE 宝马无计价器
}
CBMW* GetBMW()
{
return m_BMW;
}
private:
CBMW* m_BMW;
};
class CDirector
{
public:
// 汽车组装过程,引擎 车轮 计价器 没有就不安
CDirector(CBuilder* pAutoBuilder)
{
pAutoBuilder->BuildEngine();
pAutoBuilder->BuildWheel();
pAutoBuilder->BuildTaximeter();
}
};