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

来源:互联网 发布:自然之名酵母水 知乎 编辑:程序博客网 时间:2024/06/10 19:46

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

  1. 生成器(Builder)模式是一步步构建一个复杂的产品,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们,用户不知道内部的具体构建细节。
  2. Builder基类创建复杂产品(Product)全过程的抽象基类。Builder基类提供若干个构造部件(BuildPart)的方法(基类提供缺省实现)。具体构建产品的过程由ConcreteBuilder实现,GetResult()是获取构造完成后的对象(该方法并不在基类中!因为产品Product一般没有抽象基类。如果产品有抽象基类,GetResult就可以放在基类里)。
  3. Director在构造函数中调用Builder的构造部件方法,当最后一个部件方法调用完成后,就产生了一个复杂的产品。Director的作用是封装一个产品的各个部件装配过程。
  4. Builder基类将公共的部分提取出来,各个部件方法(BuildPart)由子类扩展实现。
  5. 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;  }  
0 0