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

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

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

 

代码实现以下:spa

//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. 构建过程容许被构造的对象有不一样的表示时3d

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

builder模式的优势在于:xml

1. 能够动态改变产品的内部表示,不一样的生成器具备不一样的表示。对象

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

3. 精细控制构造过程,builder一步步构建整个对象,最后才获得结果,中间过程是能够精细控制的。接口

(完)

相关文章
相关标签/搜索