标签:style blog http color io os 使用 ar 文件
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一步步构建整个对象,最后才得到结果,中间过程是可以精细控制的。
(完)
标签:style blog http color io os 使用 ar 文件
原文地址:http://www.cnblogs.com/coderkian/p/3967278.html