設計模式系列之生成器模式

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一步步構建整個對象,最後才獲得結果,中間過程是能夠精細控制的。接口

(完)

相關文章
相關標籤/搜索