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

设计模式C++生成器模式

2016-04-04 17:03 441 查看
定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

生成器(Builder)模式是一步步构建一个复杂的产品,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们,用户不知道内部的具体构建细节。

Builder基类创建复杂产品(Product)全过程的抽象基类。Builder基类提供若干个构造部件(BuildPart)的方法(基类提供缺省实现)。具体构建产品的过程由ConcreteBuilder实现,GetResult()是获取构造完成后的对象(该方法并不在基类中!因为产品Product一般没有抽象基类。如果产品有抽象基类,GetResult就可以放在基类里)。

Director在构造函数中调用Builder的构造部件方法,当最后一个部件方法调用完成后,就产生了一个复杂的产品。Director的作用是封装一个产品的各个部件装配过程。

Builder基类将公共的部分提取出来,各个部件方法(BuildPart)由子类扩展实现。

Director中聚合了Builder基类指针,这样可以适应不同的具体构建者。

1、Builder.h

#ifndef _BUILDER_H_
#define _BUILDER_H_

class BuilderS
{
public :
virtual void makeFun1(int m)=0;
virtual void makeFun2(int m)=0;
virtual int getResult()=0;
};

class DirectorS
{
private :
BuilderS* builder;
public :
DirectorS(BuilderS *b)
{
this->builder=b;
}
//建造过程
int construct();

};

//1#制造者
class BuilderOne:public BuilderS
{
private :
int result;
public :
BuilderOne(int r):result(r){}

virtual void makeFun1(int m);
virtual void makeFun2(int m);
virtual int getResult();

};

//2#制造者
class BuilderTwo:public BuilderS
{
private :
int result;
public :
BuilderTwo(int r):result(r){}

virtual void makeFun1(int m);
virtual void makeFun2(int m);
virtual int getResult();

};

#endif


2、Builder.cpp

#include "Builder.h"

int DirectorS::construct()
{
builder->makeFun1(10);
builder->makeFun2(2);
builder->makeFun2(3);

return builder->getResult();
}

void BuilderOne::makeFun1(int m){
result+=m;
}

void BuilderOne::makeFun2(int m)
{
result*=m;
}

int BuilderOne::getResult()
{
return result;
}

void BuilderTwo::makeFun1(int m){
result*=m;
}

void BuilderTwo::makeFun2(int m)
{
result+=m;
}

int BuilderTwo::getResult()
{
return result;
}


3、Client.cpp

#include <iostream>

#include <string>
#include "Builder.h"

using namespace std;

int main()
{
//1#
BuilderS * builder=new BuilderOne(10);
DirectorS * director=new DirectorS(builder);
cout<<director->construct()<<endl;
//2#
builder=new BuilderTwo(10);
director=new DirectorS(builder);
cout<<director->construct()<<endl;

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