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一步步构建整个对象,最后才获得结果,中间过程是能够精细控制的。接口
(完)