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

画个小人儿之建造者模式学习笔记[C++版]

2009-12-04 17:34 477 查看
/************************************************************************
* 建造者模式学习笔记[C++]
* Author:  陈相礼
* Time:    2009.12.04
* Compiler: VC8
************************************************************************/
#include "BuilderPattern.h"
#include "BuilderPattern1.h"
#include <iostream>
#include <string>
using namespace std;
void main( void )
{
//------------------建造者模式原理类测试-------------------
CDirector *director = new CDirector();// 指挥者用CConcreteBuilder来建造产品
CBuilder *b1 = new CConcreteBuilder1();
CBuilder *b2 = new CConcreteBuilder2();
director->vConstruct(b1);
CProduct *p1 = b1->cGetResult();
p1->vShow();

director->vConstruct(b2);
CProduct *p2 = b2->cGetResult();
p2->vShow();
delete(b1);
b1 = NULL;
delete(b2);
b2 = NULL;
//------------------画小人儿之建造者模式类测试-------------------
// 画一个瘦小人儿
CPersonThinBuilder *thin = new CPersonThinBuilder();
CPersonDirector *cpdt = new CPersonDirector( thin );
cpdt->vCreatePerson();
delete(thin);
thin = NULL;
delete(cpdt);
cpdt = NULL;
// 画一个胖小人儿
CPersonFatBuilder *fat = new CPersonFatBuilder();
CPersonDirector *cpdf = new CPersonDirector( fat );
cpdf->vCreatePerson();
delete(fat);
fat = NULL;
delete(cpdf);
cpdf = NULL;
}
/************************************************************************
* 小结:
*   1、建造者模式主要用于创建一些复杂的对象,这些对象间的建造顺序通
*      常是稳定的,但对象内部的构建通常面临着复杂的变化。
*   2、建造者模式的好处在于使得建造代码与表示代码分离,由于建造者隐
*      藏了该产品是如何组装的,所以若需要改变一个产品内部表示,只需
*      要再定义一个具体的建造者就可以了。
*   3、建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分
*      以及它们的装配方式时适用的模式。
************************************************************************/


#pragma once
/**********************************************
* 建造者模式原理:[生成器模式]
*   将一个复杂对象的构建与它的表示分离,使
* 得同样的构建过程可以创建不同的表示。
*   如果我们使用了创造者模式,那么用户就只
* 需要建造的类型就可以得到它们,而具体建造
* 的过程和细节就不需要知道了。
***********************************************/
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//---------------------------------------------
// 具体产品类
//      一个产品由多个部件组成。
class CProduct
{
public:
// 添加产品部件
void vAdd( string strpart )
{
mv_strpart.push_back( strpart );
}
// 列举产品所有部件
void vShow()
{
cout << "/n产品 创建-->" << endl;
vector<string>::iterator sit;
for ( sit = mv_strpart.begin(); sit != mv_strpart.end(); ++sit )
{
cout << "部件:" << *sit << endl;
}
}
protected:
private:
vector<string> mv_strpart;
};
//---------------------------------------------
// 抽象建造者类
//    为创建一个CProduct对象的各个部件指定的
// 抽象接口。
class CBuilder
{
public:
virtual void vBuildPartA(){};
virtual void vBuildPartB(){};
virtual CProduct *cGetResult(){return NULL;};
protected:
private:
};
//---------------------------------------------
// 具体建造者类
//    实现CBuilder接口,构造和装配各个部件。
class CConcreteBuilder1 : public CBuilder
{
public:
// 构造、析构
CConcreteBuilder1() : mp_prod(new CProduct()) {};
~CConcreteBuilder1()
{
if ( NULL != mp_prod )
{
delete(mp_prod);
mp_prod = NULL;
}
}
void vBuildPartA()
{
mp_prod->vAdd( "部件A" );
}
void vBuildPartB()
{
mp_prod->vAdd( "部件B" );
}
CProduct *cGetResult()
{
return mp_prod;
}
protected:
private:
CProduct *mp_prod;
};
// 同上
class CConcreteBuilder2 : public CBuilder
{
public:
// 构造、析构
CConcreteBuilder2() : mp_prod(new CProduct()) {};
~CConcreteBuilder2()
{
if ( NULL != mp_prod )
{
delete(mp_prod);
mp_prod = NULL;
}
}
void vBuildPartA()
{
mp_prod->vAdd( "部件X" );
}
void vBuildPartB()
{
mp_prod->vAdd( "部件Y" );
}
CProduct *cGetResult()
{
return mp_prod;
}
protected:
private:
CProduct *mp_prod;
};
//---------------------------------------------
// 指挥者类
//    构建一个使用CBuilder接口的对象。
class CDirector
{
public:
void vConstruct( CBuilder* pbuilder )
{
pbuilder->vBuildPartA();
pbuilder->vBuildPartB();
}
protected:
private:
};


#pragma once
/**********************************************
*
* 建造者模式应用:画个小人儿
*
***********************************************/
#include <iostream>
using namespace std;
// 建造者类
class CPersonBuilder
{
public:
virtual void vBuilderHead(){};// 头部
virtual void vBuilderBody(){};// 身体
virtual void vBuilderArmL(){};// 左手
virtual void vBuilderArmR(){};// 右手
virtual void vBuilderLegL(){};// 左脚
virtual void vBuilderLegR(){};// 右脚
protected:
private:
};
// 画一个瘦的小人
class CPersonThinBuilder : public CPersonBuilder
{
public:
void vBuilderHead()// 头部
{
cout << "瘦小的头部!" << endl;
}
void vBuilderBody()// 身体
{
cout << "瘦小的身体!" << endl;
}
void vBuilderArmL()// 左手
{
cout << "瘦小的左手!" << endl;
}
void vBuilderArmR()// 右手
{
cout << "瘦小的右手!" << endl;
}
void vBuilderLegL()// 左脚
{
cout << "瘦小的左脚!" << endl;
}
void vBuilderLegR()// 右脚
{
cout << "瘦小的右脚!" << endl;
}
protected:
private:
};
// 画一个肥胖的小人
class CPersonFatBuilder : public CPersonBuilder
{
public:
void vBuilderHead()// 头部
{
cout << "肥胖的头部!" << endl;
}
void vBuilderBody()// 身体
{
cout << "肥胖的身体!" << endl;
}
void vBuilderArmL()// 左手
{
cout << "肥胖的左手!" << endl;
}
void vBuilderArmR()// 右手
{
cout << "肥胖的右手!" << endl;
}
void vBuilderLegL()// 左脚
{
cout << "肥胖的左脚!" << endl;
}
void vBuilderLegR()// 右脚
{
cout << "肥胖的右脚!" << endl;
}
protected:
private:
};
// 指挥者类
class CPersonDirector
{
public:
// 告诉指挥者,我要创建什么样的小人
CPersonDirector( CPersonBuilder *pb ) : mp_pb(pb) {};
// 根据用户的选择建造小人
void vCreatePerson()
{
mp_pb->vBuilderHead();
mp_pb->vBuilderBody();
mp_pb->vBuilderArmL();
mp_pb->vBuilderArmR();
mp_pb->vBuilderLegL();
mp_pb->vBuilderLegR();
}
protected:
private:
CPersonBuilder *mp_pb;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: