建造者模式

 

建造者模式(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();
	}
};


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值