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

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一步步构建整个对象,最后才得到结果,中间过程是可以精细控制的。

(完)

原文地址:https://www.cnblogs.com/coderkian/p/3967278.html