您的位置:首页 > 产品设计 > UI/UE

设计模式 -- BUILDER模式

2010-10-10 13:44 211 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: