Builder模式
2015-07-10 19:03
525 查看
Builder模式
Builder模式要解决的问题是把对象的构建和对象的表示分开来。当对象复杂的时候我,我们可以一步步来构建对象,在每一步的构建过程中,可以引入参数,通过不同的参数,即使经过相同的步骤最后可以得到不同的对象。通过一个实例来说明,Product是我们要构建的对象,在Builder类中构建,通过BuildPartA、BuildPartB、BuildPartC三步来构建对象,一个ConcreteBuilder类来具体实现Builder类,通过Director类来调用Builder类指导构建过程。
下图是Builder模式的类结构图。
//Product.h
#ifndef _PRODUCT_H #define _PRODUCT_H class Product { public: Product(); ~Product(); void ProductPart(); protected: private: }; class ProductPart { public: ProductPart(); ~ProductPart(); ProductPart* BuildPart(); protected: private: }; #endif
//Product.cpp
#include"Product.h" #include<iostream> Product::Product() { std::cout << "Product Ctor" << std::endl; } Product::~Product() { std::cout << "Product Dtor" << std::endl; } void Product::ProductPart() { } ProductPart::ProductPart() { std::cout << "ProductPart Cotr" << std::endl; } ProductPart::~ProductPart() { std::cout << "ProductPart Dtor" << std::endl; } ProductPart* ProductPart::BuildPart() { return NULL; }
//Builder.h
//Builder.cpp #include"Builder.h" #include"Product.h" #include<iostream> using namespace std; Builder::Builder() { } Builder::~Builder() { } ConcreteBuilder::ConcreteBuilder() { } ConcreteBuilder::~ConcreteBuilder() { } void ConcreteBuilder::BuildPartA(const string& buildPara) { cout << "Step1: Build PartA..." << buildPara << endl; } void ConcreteBuilder::BuildPartB(const string& buildPara) { cout << "Step2: Build PartB..." << buildPara << endl; } void ConcreteBuilder::BuildPartC(const string& buildPara) { cout << "Step3: Build PartC..." << buildPara << endl; } Product* ConcreteBuilder::GetProduct() { BuildPartA("pre-define"); BuildPartB("pre-define"); BuildPartC("pre-define"); return new Product(); }
//Director.h
//Director.h #ifndef _DIRECTOR_H_ #define _DIRECTOR_H_ class Builder; class Director { public: Director(Builder* bld); ~Director(); void Construct(); protected: private: Builder* _bld; }; #endif
//Director.cpp
//Director.cpp #include"Director.h" #include"Builder.h" Director::Director(Builder* bld) { _bld = bld; } Director::~Director() { } void Director::Construct() { _bld->BuildPartA("user-define"); _bld->BuildPartB("user-define"); _bld->BuildPartC("user-define"); }
//main.cpp
//main.cpp #include"Builder.h" #include"Product.h" #include"Director.h" #include<iostream> int main(int agrc, char* agrv[]) { Director* d = new Director(new ConcreteBuilder()); d->Construct(); return 0; }
相关文章推荐
- UIAlertView和UIActionSheet
- Flash Builder4编译慢报java heap space堆空间异常错误的解决方法
- UI 设计师的好网站
- BlockingQueue及其各个实现的分析整理
- Exynos4412 Android4.4 HDMI Porting Guid 第三篇
- Exynos4412 Android4.4 HDMI Porting Guid 第二篇
- HTC T328W刷机包 仿三星S5 UI美化 精简 S5落下
- UITextView自带的手机、网址识别和触发方法!
- [SoapUI] 比较两个不同环境下的XML Response, 从外部文件读取允许的偏差值,输出结果到Excel
- IOS之UITextField 禁止粘贴
- 解决:QWidget: Cannot create a QWidget when no GUI is being used 程序异常结束
- UIView之drawRect
- Exynos4412 Android4.4 HDMI Porting Guid 第一篇
- DelayQueue原理分析
- Core Bluetooth Programming Guide
- 理解 Android Build 系统
- POJ 1986 - Distance Queries(LCA‘ 在线算法RMQ)
- could not build module 'Foundation' ios QRCodeGenerator libqrencode
- PHP中include和require的区别
- EasyUi的datagrid数据加载