设计模式 -- BUILDER模式
2010-10-10 13:44
211 查看
Builder 模式要解决的也正是这样的问题:当我们要创建的对象很复杂的时候(通常是
由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分
离开来,这样做的好处就是通过一步步的进行复杂对象的构建,由于在每一步的构造过程中
可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。
下面是我写的一个模拟汽车制造的例子,不知道是否明确的把BUILDER模式的思想表达和准确应用了。按照我的理解,product和productPart为产品和产品部件,产品其实是由builder负责集成制造的,而产品的部件由各个部件制造商进行你给制造,这也就使得各个部件厂商可以根据需要进行加工和细化制作。而director是一个第三方的根据客户需求提供要求,定制产品的监制集成商,它负责根据客户需求设计组装方案、下订单给builder,并且雇佣builder进行生产组装,最后builder负责提供完整的产品出来。具体到部件商,就是负责部件的生产,供货给builder了。
具体的代码实现部分,网络上也看到不少。但是大家对于director的出现与否有异议。实现也各不相同,有的就是借鉴了BUILDER模式的思想,但是实现了一个不完整的BUILDER应用。我觉得似乎对这个模式的理解还有些偏差。自己准备琢磨下,编写一个汽车制造的BUILDER应用案例出来。
待续。。。
下面是我写的一个模拟汽车制造的例子,不知道是否明确的把BUILDER模式的思想表达和准确应用了。
由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分
离开来,这样做的好处就是通过一步步的进行复杂对象的构建,由于在每一步的构造过程中
可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。
下面是我写的一个模拟汽车制造的例子,不知道是否明确的把BUILDER模式的思想表达和准确应用了。按照我的理解,product和productPart为产品和产品部件,产品其实是由builder负责集成制造的,而产品的部件由各个部件制造商进行你给制造,这也就使得各个部件厂商可以根据需要进行加工和细化制作。而director是一个第三方的根据客户需求提供要求,定制产品的监制集成商,它负责根据客户需求设计组装方案、下订单给builder,并且雇佣builder进行生产组装,最后builder负责提供完整的产品出来。具体到部件商,就是负责部件的生产,供货给builder了。
具体的代码实现部分,网络上也看到不少。但是大家对于director的出现与否有异议。实现也各不相同,有的就是借鉴了BUILDER模式的思想,但是实现了一个不完整的BUILDER应用。我觉得似乎对这个模式的理解还有些偏差。自己准备琢磨下,编写一个汽车制造的BUILDER应用案例出来。
待续。。。
下面是我写的一个模拟汽车制造的例子,不知道是否明确的把BUILDER模式的思想表达和准确应用了。
// Product.h #pragma once class CAutoPart; ////////////////////////////////////////////////////////////////////////// // 抽象汽车 class CAuto { public: CAuto(void); virtual ~CAuto(void); virtual int InstallCarPart(CAutoPart* pAutoPart) = 0; }; // 具体小轿车 class CCar : public CAuto { public: CCar(void); virtual ~CCar(void); virtual int InstallCarPart(CAutoPart* pAutoPart); }; ////////////////////////////////////////////////////////////////////////// // 抽象部件 class CAutoPart { public: CAutoPart(void); virtual ~CAutoPart(void) = 0; // 安装部件到目标产品 virtual int InstallPart(CAuto* pAuto) = 0; }; ////////////////////////////////////////////////////////////////////////// // 汽车轮子 class CCarWheel : public CAutoPart { public: CCarWheel(void); virtual ~CCarWheel(void); virtual int InstallPart(CAuto* pAuto); }; ////////////////////////////////////////////////////////////////////////// // 方向盘 class CCarSteeringWheel : public CAutoPart { public: CCarSteeringWheel(void); virtual ~CCarSteeringWheel(void); virtual int InstallPart(CAuto* pAuto) ; }; ////////////////////////////////////////////////////////////////////////// // 油箱 class CCarTank : public CAutoPart { public: CCarTank(void); virtual ~CCarTank(void); virtual int InstallPart(CAuto* pAuto); };
// Product.cpp #include "StdAfx.h" #include "Product.h" #include <iostream> using namespace std; ////////////////////////////////////////////////////////////////////////// CAutoPart::CAutoPart() { } CAutoPart::~CAutoPart(void) { } CCarWheel::CCarWheel() { cout<<"制造4个轮子..."<<endl; } CCarWheel::~CCarWheel(void) { } int CCarWheel::InstallPart(CAuto* pAuto) { cout<<"安装轮子..."<<endl; return 0; } CCarSteeringWheel::CCarSteeringWheel() { cout<<"制造1个方向盘..."<<endl; } CCarSteeringWheel::~CCarSteeringWheel(void) { } int CCarSteeringWheel::InstallPart(CAuto* pAuto) { cout<<"安装方向盘..."<<endl; return 0; } CCarTank::CCarTank() { cout<<"制造1副油箱..."<<endl; } CCarTank::~CCarTank(void) { } int CCarTank::InstallPart(CAuto* pAuto) { cout<<"安装油箱..."<<endl; return 0; } ////////////////////////////////////////////////////////////////////////// CAuto::CAuto(void) { } CAuto::~CAuto(void) { } CCar::CCar() { } CCar::~CCar(void) { } int CCar::InstallCarPart(CAutoPart* pAutoPart) { pAutoPart->InstallPart(this); return 0; }
// Builder.h #pragma once class CAuto; class CAutoPart; class CCarWheel; class CCarSteeringWheel; class CCarTank; class CAutoBuilder { public: virtual ~CAutoBuilder(void); public: virtual CAutoPart* MakeAutoPart( int PartID) = 0; virtual CCarWheel* MakeWheels() = 0; virtual CCarSteeringWheel* MakeSteeringWheel() = 0; virtual CCarTank* MakeTank() = 0; virtual CAuto* GetCar() = 0; protected: CAutoBuilder(void); protected: CAuto* m_pAuto; CCarWheel* m_pWheel; CCarSteeringWheel* m_pSteeringWheel; CCarTank* m_pTank; }; class CCarBuilder : public CAutoBuilder { public: CCarBuilder(void); virtual ~CCarBuilder(void); public: virtual CAutoPart* MakeAutoPart( int PartID); virtual CCarWheel* MakeWheels(); virtual CCarSteeringWheel* MakeSteeringWheel(); virtual CCarTank* MakeTank(); virtual CAuto* GetCar(); private: };
// Builder.cpp #include "StdAfx.h" #include "Builder.h" #include "Product.h" #include <iostream> using namespace std; CAutoBuilder::CAutoBuilder(void) { m_pAuto = NULL; m_pWheel = NULL; m_pSteeringWheel = NULL; m_pTank = NULL; } CAutoBuilder::~CAutoBuilder(void) { if (m_pAuto) { delete m_pAuto; } if (m_pWheel) { delete m_pWheel; } if (m_pSteeringWheel) { delete m_pSteeringWheel; } if (m_pTank) { delete m_pTank; } } CCarBuilder::CCarBuilder(void) { m_pAuto = new CCar(); } CCarBuilder::~CCarBuilder(void) { if (m_pAuto) { delete m_pAuto; } } CAutoPart* CCarBuilder::MakeAutoPart( int PartID) { switch (PartID) { case 1: return MakeWheels(); break; case 2: return MakeSteeringWheel(); break; case 3: return MakeTank(); break; } return NULL; } CCarWheel* CCarBuilder::MakeWheels() { m_pWheel = new CCarWheel(); m_pAuto->InstallCarPart(m_pWheel); return m_pWheel; } CCarSteeringWheel* CCarBuilder::MakeSteeringWheel() { m_pSteeringWheel = new CCarSteeringWheel(); m_pAuto->InstallCarPart(m_pSteeringWheel); return m_pSteeringWheel; } CCarTank* CCarBuilder::MakeTank() { m_pTank = new CCarTank(); m_pAuto->InstallCarPart(m_pTank); return m_pTank; } CAuto* CCarBuilder::GetCar() { /*m_pAuto->InstallCarPart(m_pWheel); m_pAuto->InstallCarPart(m_pSteeringWheel); m_pAuto->InstallCarPart(m_pTank);*/ cout<<"小汽车下线了..."<<endl; return m_pAuto; }
// Director.h #pragma once class CAutoBuilder; class CDirector { public: CDirector(CAutoBuilder* pAutoBuilder); virtual ~CDirector(void); void Construct(void); void MakeCar(void); private: CDirector(void); private: CAutoBuilder* m_pAutoBuilder; }; // Director.cpp #include "StdAfx.h" #include "Director.h" #include "Builder.h" #include "Product.h" CDirector::CDirector(void) { } CDirector::CDirector(CAutoBuilder* pAutoBuilder) : m_pAutoBuilder(pAutoBuilder) { } CDirector::~CDirector(void) { } void CDirector::Construct(void) { m_pAutoBuilder->MakeWheels(); m_pAutoBuilder->MakeSteeringWheel(); m_pAutoBuilder->MakeTank(); } void CDirector::MakeCar(void) { Construct(); }
// Builder_Pattern.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "Director.h" #include "Builder.h" #include "Product.h" int _tmain(int argc, _TCHAR* argv[]) { // 汽车 builder CAutoBuilder* pAutoBuilder = new CCarBuilder(); // 汽车制造监制 director CDirector* pDirector = new CDirector(pAutoBuilder); // 监制下令生产组装一部小汽车 pDirector->Construct(); //pDirector->MakeCar(); // 汽车制造者提供了一部汽车下线 CAuto* pCar = pAutoBuilder->GetCar(); // 可以使用汽车了 delete pAutoBuilder; delete pDirector; return 0; }
相关文章推荐
- 设计模式之Builder
- C++设计模式之二:Builder(生成器)
- 我所理解的设计模式(C++实现)——建造者模式(Builder Pattern)
- 设计模式----Builder
- Builder设计模式
- 24种设计模式--建造者模式【Builder Pattern】
- 设计模式---生成器(Builder)
- 深入浅出设计模式 ------ Builder(生成器模式)
- JAVA设计模式------建造者模式(Builder模式)
- 设计模式之Builder Model(笔记)
- 设计模式-创建型模式#建造者模式Builder
- 【初学设计模式】Builder (生成器)
- 设计模式之Builder
- 读书笔记_java设计模式深入研究 第四章 生成器模式 (建造者模式) Builder
- 设计模式之建造者模式(Builder)
- 设计模式(三):建造者模式Builder(创建型模式)
- 设计模式 (四)创建者模式(Builder)
- 设计模式(三)-建造者模式(Builder模式)
- builder设计模式,写和很好
- 做一顿家常便饭,建造者设计模式(Builder)