设计模式之建造者模式
【定义】建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
【场景】一个简单的XML解析器,XML解析可以分两部分,第一部分:开始标签,结束标签,属性等,这部分对于所有的XML文件处理都是一样的,因为每个XML都由开始标签,结束标签等构成;第二部分:标签名,标签属性名,标签属性值等,这一部分会随着XML的不同,会有不同的处理,因为每个XML的标签名肯定会有差异。这样我们可以将XML 解析器对象的创建(包括分析开始标签,结束标签等)和它的表示(根据具体的标签名、属性名和属性值)分离。让XML Parser对象拥有一个Builder对象,Builder对象有一系列接口,包括对属性名,属性值的解析。这样当处理不同的XML时,更换Parser对象的Builder对象即可。
【UML】
【代码】以下代码极不严谨,望谅解
#include <iostream> #include <string> #include <vector> using namespace std; class Product { private: vector<string> vec; public: void addCompose(string str) { vec.push_back(str); } void show() { cout<<"Product: "; vector<string>::iterator iter = vec.begin(); for( ; iter != vec.end(); ++iter) { cout<<*iter<<" "; } cout<<endl; } }; class Builder { protected: Product product; public: virtual void builderPartA(){} virtual void builderPartB(){} virtual Product getResult() { return product; } }; class BuilderConcreteOne : public Builder { public: virtual void builderPartA() { product.addCompose("OneA"); } virtual void builderPartB() { product.addCompose("OneB"); } virtual Product getResult() { return product; } }; class BuilderConcreteTwo : public Builder { public: virtual void builderPartA() { product.addCompose("TwoA"); } virtual void builderPartB() { product.addCompose("TwoB"); } virtual Product getResult() { return product; } }; class Director { private: Builder* builder; public: void construct(Builder* b) { builder = b; builder->builderPartA(); builder->builderPartB(); } }; int main() { Director d; Builder* one = new BuilderConcreteOne; d.construct(one); Product p = one->getResult(); p.show(); delete one; return 0; }
不积跬步无以至千里,不积小流无以成江河。