您的位置:首页 > 编程语言 > C语言/C++

设计模式之 创建者(Builder)模式(C++实现)

2016-03-31 22:52 453 查看
这篇文章介绍设计模式中 "创建型模式"的第三种 —— 创建者(Builder)模式。

创建者模式将复杂对象的构造和表示相分离,同样的构建过程可以创建不同的表示。

其强调创建产品的过程是有步骤的,有时候甚至可以强制指定构建次序。

其中产品的不同表现形式是通过扩展 构造器 实现的。

下面以汽车产品为例进行说明,比如汽车包括:汽车厂商 汽车引擎 汽车底盘 汽车轮胎。

一个汽车厂商生产的汽车,各部件可以采用不同公司生产的,只需对其进行组合即可。

因此定义一个抽象创建者类,该类提供了上述各个部件的实现接口。

对于不同的factory,生成一个相应的创建者Builder(继承自抽象创建者类),实现抽象类中的相应方法即可。

代码如下:

#include <iostream>
#include <string>
#include <memory>

using namespace std;

// 产品(包括多个部件)
class CCar
{
public:
void setManufactory(const string& manufactory)
{
m_strManufactory = manufactory;
}
const string& getManufactory()
{
return m_strManufactory;
}

// 部件1
void setEngine(const string& engine)
{
m_strEngine = engine;
}
const string& getEngine()
{
return m_strEngine;
}

// 部件2
void setUnderPan(const string& underPan)
{
m_strUnderPan = underPan;
}
const string& getUnderPan()
{
return m_strUnderPan;
}

// 部件3
void setWheel(const string& wheel)
{
m_strWheel = wheel;
}
const string& getWheel()
{
return m_strWheel;
}

void printInfo()
{
cout << m_strManufactory << " " << m_strEngine <<
" " << m_strUnderPan << " " << m_strWheel << endl;
}

private:
string m_strManufactory;
string m_strEngine;
string m_strUnderPan;
string m_strWheel;
};

// Abstract Builder
class CCarBuildBase
{
public:
// 不变的部分作为公开接口函数 这里的接口需要稳定
CCar* build()
{
buildManufactory();
buildEngine();
buildUnderPan();
buildWheel();

return &m_car;
}

protected:
// 可变的部分由子类实现
// 复杂Car对象由以下几个模块组成
virtual void buildManufactory() = 0;
virtual void buildEngine() = 0;
virtual void buildUnderPan() = 0;
virtual void buildWheel() = 0;
CCar m_car;
};

// 第一个concrete builder
class GMCarBuilder :public CCarBuildBase
{
protected:
void buildManufactory()
{
m_car.setManufactory("GM");
}

void buildEngine()
{
m_car.setEngine("劳斯莱斯引擎");
}

void buildUnderPan()
{
m_car.setUnderPan("GM底盘");
}

void buildWheel()
{
m_car.setWheel("Miklon轮胎");
}
};

// 第二个concrete builder
class FordCarBuilder :public CCarBuildBase
{
protected:
void buildManufactory()
{
m_car.setManufactory("Ford");
}

void buildEngine()
{
m_car.setEngine("劳斯莱斯引擎");
}

void buildUnderPan()
{
m_car.setUnderPan("Benz底盘");
}

void buildWheel()
{
m_car.setWheel("PulySitong轮胎");
}
};

// 创建产品(CCar)的指导类
class CCarDirector
{
public:
CCar* buildCar(CCarBuildBase* pBuilder)
{
return pBuilder->build();
}
};

// 测试函数
void testBuilder()
{
CCarDirector director;
GMCarBuilder gmBuilder;
FordCarBuilder fordBuilder;

CCar* pCar = director.buildCar(&gmBuilder);
pCar->printInfo();

pCar = director.buildCar(&fordBuilder);
pCar->printInfo();

delete pCar;
pCar = NULL;
}

int main(void)
{
testBuilder();

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: