设计模式系列之生成器模式

builder模式主要用于创建复杂对象,着重于复杂对象的内部构建。通过将构建过程与表示分离,同一个构建过程可以生产不同的外部表示。builder模式由导向器和生成器构成,导向器负责构建过程,生成器负责生产对象的外部表示。导向器包含有一个生成器,当需要更换对象表示时,只需要换一个生成器即可。

上篇文章设计芯片设计软件时,abstract factory更加着重于支持创造多个掩模系列上图形的功能。现在我们换一个重点,现在给出一个掩模上所有图形的信息,这个信息可以存储在格式化文件比如xml文件中,为了方便,在不影响理解的前提下我们使用简单的文本文件,一个字符串表示掩模上的一个图形,比如读入“round”,表示掩模上有个圆形。定义类builder作为导向器,有一个构建过程结构,负责读入文件逐个构建图形。类MaskFigure是一个虚基类,含有构建不同图形的接口,派生出的子类是可以生成不同特点图形的生成器,即负责外部表示。builder包含不同的MaskFigure子类就可以在不修改构建过程接口的前提下生成不同特点的图形。类接口如下:

 设计模式系列之生成器模式

代码实现如下:

//mask.hpp

#ifndef MASK_HPP

#define MASK_HPP



class MaskFigure{

  public:

    virtual ~MaskFigure()=0;

    virtual void CreateRound()=0;

    virtual void CreateRec()=0;

    virtual void CreateTri()=0;

  protected:

    MaskFigure();

};



class MaskAFigure:public MaskFigure {

  public:

    MaskAFigure();

    ~MaskAFigure();

    void CreateRound();

    void CreateRec();

    void CreateTri();

};



class MaskBFigure:public MaskFigure {

  public:

    MaskBFigure();

    ~MaskBFigure();

    void CreateRound();

    void CreateRec();

    void CreateTri();

};

#endif

//mask.cpp

#include <iostream>

#include "mask.hpp"



using std::cout;

using std::endl;



MaskFigure::MaskFigure() {



}



MaskFigure::~MaskFigure() {



}



MaskAFigure::MaskAFigure(){

  cout<<"init MaskAFigure "<<endl;

}



MaskAFigure::~MaskAFigure() {

  cout<<"delete MaskAFigure"<<endl;

}



void MaskAFigure::CreateRound(){

  cout<<"create MaskA Round"<<endl;

}



void MaskAFigure::CreateRec(){

  cout<<"create MaskA Rec"<<endl;

}



void MaskAFigure::CreateTri(){

  cout<<"create MaskA Tri"<<endl;

}



MaskBFigure::MaskBFigure(){

  cout<<"init MaskBFigure "<<endl;

}



MaskBFigure::~MaskBFigure() {

  cout<<"delete MaskBFigure"<<endl;

}



void MaskBFigure::CreateRound(){

  cout<<"create MaskB Round"<<endl;

}



void MaskBFigure::CreateRec(){

  cout<<"create MaskB Rec"<<endl;

}



void MaskBFigure::CreateTri(){

  cout<<"create MaskB Tri"<<endl;

}

//builder.hpp

#ifndef BUILDER_HPP

#define BUILDER_HPP



#include <iostream>

#include <fstream>

#include <vector>

#include "mask.hpp"



using std::vector;

using std::cout;

using std::endl;

using std::ifstream;

using std::string;



class MaskBuilder {

 public:

   MaskBuilder(string &, MaskFigure*);

   ~MaskBuilder();

   bool openFile(string &);

   void BuildMask();

   void setMaskFigure(MaskFigure*);

 private:

   ifstream inf;

   MaskFigure *mf;

};



#endif

//builder.cpp

#include <string>

#include "builder.hpp"



MaskBuilder::MaskBuilder(string &filename, MaskFigure *_mf):inf(), mf(_mf) {

  openFile(filename);

}



MaskBuilder::~MaskBuilder(){

  inf.close();

}



bool MaskBuilder::openFile(string& filename){

  if(inf.is_open()){

    inf.close();

    inf.clear(std::ios_base::goodbit);

  }



  inf.open(filename);

  if(!inf){

    cout<<"open file \""<<filename<<"\" failure"<<endl;

    return false;

  }

  return true;

}



void MaskBuilder::setMaskFigure(MaskFigure* _mf) {

  mf = _mf;

}



void MaskBuilder::BuildMask(){

  string ftype;

  while(inf>>ftype){

    if(ftype == "round"){

      mf->CreateRound();

    }else if(ftype == "rec"){

      mf->CreateRec();

    }else if(ftype == "tri"){

      mf->CreateTri();

    }else {

      cout<<"undefine figure type: "<<ftype<<endl;

    }

  }

}

//main.cpp

#include <iostream>

#include "builder.hpp"



using std::cout;

using std::endl;



int main() {

  string filename("types");

  MaskAFigure maf;

  MaskBuilder mb(filename,&maf);

  mb.BuildMask();

  MaskBFigure mbf;

  mb.setMaskFigure(&mbf);

  string filename2("types2");

  mb.openFile(filename2);

  mb.BuildMask();

}

builder模式适用于:

1. 构建过程允许被构造的对象有不同的表示时

2. 创建复杂对象过程独立于他们对象的组成方式

builder模式的优点在于:

1. 可以动态改变产品的内部表示,不同的生成器具有不同的表示。

2. 构造代码和表示代码分开,提高了对象的模块性和复用性。

3. 精细控制构造过程,builder一步步构建整个对象,最后才得到结果,中间过程是可以精细控制的。

(完)

你可能感兴趣的:(设计模式)