(九)建造者模式
2016-02-17 17:07
225 查看
描述:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。[DP]
我的理解,比如建造一个产品,有一些必要的部分组成,如自行车有前后两个轮子和车架,那么不论我生产山地车,还是公路车都需要建造这些部分,只是表示形式不同而已,那么可以把建造前后轮子和车架的接口抽象出来,然后定义山地车和公路车两种类作为生产线,而总经理只需要关心,我要造什么特种自行车就行了,具体的建造细节交给两种生产线自行处理,同时不会出现少造了轮子的情况,以为抽象类定义了需要建造的部分,必须在子类中实现。
UML图:
代码示例:
输出:
上面的源码中的Director是为指挥建造过程。用户需要什么样的产品,直接传给指挥者就可以了,这样避免了用户接触建造产品组件的接口函数,减少了耦合。
建造者模式适用的场景;
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。(好好理解一下吧~~~)
我的理解,比如建造一个产品,有一些必要的部分组成,如自行车有前后两个轮子和车架,那么不论我生产山地车,还是公路车都需要建造这些部分,只是表示形式不同而已,那么可以把建造前后轮子和车架的接口抽象出来,然后定义山地车和公路车两种类作为生产线,而总经理只需要关心,我要造什么特种自行车就行了,具体的建造细节交给两种生产线自行处理,同时不会出现少造了轮子的情况,以为抽象类定义了需要建造的部分,必须在子类中实现。
UML图:
代码示例:
// Builder.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <memory> #include <list> #include <string> using namespace std; class Product { public: void Add(const string &str) { parts.push_back(str); } //展示创建的产品 void Show() { cout << "\n 产品创建 ---" << endl; auto it = parts.cbegin(); for (; it != parts.cend(); ++it) { cout << *it; } } private: list<string> parts; }; class Builder { public: virtual ~Builder(){} virtual void BuildPartA() = 0; virtual void BuildPartB() = 0; //获得构建的产品 virtual Product Getresult() = 0; }; class ConcreteBuilder1 : public Builder { public: void BuildPartA() { product.Add("部件A "); } void BuildPartB() { product.Add("部件B"); } Product Getresult() { return product; } private: Product product; }; class ConcreteBuilder2 : public Builder { public: void BuildPartA() { product.Add("部件 X "); } void BuildPartB() { product.Add("部件 Y\n"); } Product Getresult() { return product; } private: Product product; }; class Director { public: static void Construct(Builder * builder) { builder->BuildPartA(); builder->BuildPartB(); } }; int _tmain(int argc, _TCHAR* argv[]) { Builder * b1 = new ConcreteBuilder1; Builder * b2 = new ConcreteBuilder2; Director::Construct(b1); Product p1 = b1->Getresult(); p1.Show(); Director::Construct(b2); Product p2 = b2->Getresult(); p2.Show(); return 0; }
输出:
上面的源码中的Director是为指挥建造过程。用户需要什么样的产品,直接传给指挥者就可以了,这样避免了用户接触建造产品组件的接口函数,减少了耦合。
建造者模式适用的场景;
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。(好好理解一下吧~~~)
相关文章推荐
- 系统重启后ngix reload不生效原因分析
- vsftpd详解
- 【运动传感器】Madgwick算法(下)
- Kotlin初体验
- 向数据库中添加内容 manageStdInfo.aspx
- ubuntu安装php7.0.3遇到的问题
- JSP
- 任务调度的 Java 实现方法二:quartz
- Virtual Box 复制虚拟机后网络冲突或者无法启动 问题解决方法
- Spring事务配置的五种方式
- 奇怪的电梯解题报告
- PHP之数据分组
- c#中abstract、override、new、virtual、sealed使用和示例
- c语言实现去除代码中的注释
- libcurl - curl_easy_perform 返回值说明
- Orchard基本概念快速理解
- 【运动传感器】Madgwick算法(上)
- JAVA构造函数的调用
- 优步UBER司机全国各地最新奖励政策汇总(持续更新...)
- SOAP消息的结构