设计模式读书笔记:Builder(建造者)
2015-07-03 11:11
645 查看
意图:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
结构图:来自《23种设计模式 - 郗晓勇》
实现:https://github.com/panshiqu/patterns/tree/master/Builder
Product
Builder
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
结构图:来自《23种设计模式 - 郗晓勇》
实现:https://github.com/panshiqu/patterns/tree/master/Builder
Product
#include <iostream> namespace NS_BUILDER { class Product { public: Product() : _color("none"), _size("none") {} virtual ~Product() {} void printSelf(void) { std::cout << "Build color: " << _color << " size: " << _size << std::endl; } void setColor(std::string color) { _color = color; } void setSize(std::string size) { _size = size; } private: std::string _color; std::string _size; }; } /* namespace NS_BUILDER */
Builder
#include <iostream> namespace NS_BUILDER { class Builder { public: Builder() {} virtual ~Builder() {} virtual void setColor(std::string color) = 0; virtual void setSize(std::string size) = 0; }; } /* namespace NS_BUILDER */ConcreteBuilderA
#include "Product.h" #include "Builder.h" namespace NS_BUILDER { class ConcreteBuilderA : public Builder { public: ConcreteBuilderA() { _product = new Product(); } virtual ~ConcreteBuilderA() {} virtual void setColor(std::string color) { // do nothing } virtual void setSize(std::string size) { _product->setSize(size); } Product *getIgnoreColorProduct(void) { return _product; } private: Product *_product; }; } /* namespace NS_BUILDER */ConcreteBuilderB
#include "Product.h" #include "Builder.h" namespace NS_BUILDER { class ConcreteBuilderB : public Builder { public: ConcreteBuilderB() { _product = new Product(); } virtual ~ConcreteBuilderB() {} virtual void setColor(std::string color) { _product->setColor(color); } virtual void setSize(std::string size) { _product->setSize(size); } Product *getCareColorProduct(void) { return _product; } private: Product *_product; }; } /* namespace NS_BUILDER */Director
namespace NS_BUILDER { class Builder; class Director { public: Director(Builder *builder) : _builder(builder) {} virtual ~Director() {} void Build(void); private: Builder *_builder; }; } /* namespace NS_BUILDER */
#include "Director.h" #include "Builder.h" namespace NS_BUILDER { void Director::Build(void) { // 可能配置中读出来的属性 _builder->setColor("red"); _builder->setSize("big"); } } /* namespace NS_BUILDER */main
#include "Builder/Director.h" #include "Builder/ConcreteBuilderA.h" #include "Builder/ConcreteBuilderB.h" #include "Builder/Product.h" using namespace NS_BUILDER; int main(void) { ConcreteBuilderB *builder = new ConcreteBuilderB(); Director *director = new Director(builder); director->Build(); Product *product = builder->getCareColorProduct(); product->printSelf(); delete builder; delete director; delete product; }附加:
相关文章推荐
- UEFI是什么?与BIOS的区别在哪里?UEFI详解!
- iOS UINavgationController、 UINavigationBar、 UINavigationItem关系分析
- 自已实现一个UI库-实现Windows的一个模拟器
- 自已实现一个UI库-实现画图API接口
- emulator: ERROR: x86 emulation currently requires hardware acceleration!Please ensure Intel HAXM is
- UITabbar 显示小红点 (消息提示)
- 设计师成长的五个阶段。
- 如何ScrollView在XIB或者Storyboard中设置约束并实现翻页滚动效果
- StringBuilder与StringBuffer联系与区别
- 自已实现一个UI库
- 完全代码实现UITableView下拉更新,异步请求数据
- UIScrollView的简单使用 以及一些常用属性
- UIautomator运行步骤
- illegal to have multiple occurrences of contentType with different values (old: text/html; charset=UTF-8, new: text/html; charset=utf-8)
- Kendo UI treeview 的使用
- stl之deque双端队列容器
- String,StringBuffer以及StringBuilder的区别
- MSQL优化基础(frequence直方图选择率)
- Kendo UI k-template 的使用
- projecteuler---->problem=14----Longest Collatz sequence