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