建造者模式
来源:互联网 发布:网络项目投标书 编辑:程序博客网 时间:2024/06/15 19:36
1.定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
《大话设计模式》举了一个很好的例子——建造小人,一共需建造6个部分,头部、身体、左右手、左右脚。与工厂模式不同,建造者模式是在导向者的控制下一步一步构造产品的。建造小人就是在控制下一步步构造出来的。创建者模式可以能更精细的控制构建过程,从而能更精细的控制所得产品的内部结构。下面给出建造者模式的UML图,以建造小人为实例。
2.UML图
建造者模式一般应用于构建产品的步骤(也可以称为算法)不变,而每个步骤的具体实现又剧烈变化的情况。
对于客户来说,只需知道导向者就可以了,通过导向者,客户就能构造复杂的对象,而不需要知道具体的构造过程。下面给出小人例子的代码实现。
3.代码实现
优点
1).隔离了构建的步骤和具体的实现,为产品的具体实现提供了灵活度。
2).封装和抽象了每个步骤的实现,实现了依赖倒转原则。
3).封装了具体的步骤,减少了代码的冗余。
缺点
要求构建产品的步骤(算法)是不能剧烈变化的,最好是不变的,这样就影响了灵活度。
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
《大话设计模式》举了一个很好的例子——建造小人,一共需建造6个部分,头部、身体、左右手、左右脚。与工厂模式不同,建造者模式是在导向者的控制下一步一步构造产品的。建造小人就是在控制下一步步构造出来的。创建者模式可以能更精细的控制构建过程,从而能更精细的控制所得产品的内部结构。下面给出建造者模式的UML图,以建造小人为实例。
2.UML图
建造者模式一般应用于构建产品的步骤(也可以称为算法)不变,而每个步骤的具体实现又剧烈变化的情况。
对于客户来说,只需知道导向者就可以了,通过导向者,客户就能构造复杂的对象,而不需要知道具体的构造过程。下面给出小人例子的代码实现。
3.代码实现
#include <iostream>using namespace std;class Builder{public:virtual void BuildHead() = 0;virtual void BuildBody() = 0;virtual void BuildLeftArm() = 0;virtual void BuildRightArm() = 0;virtual void BuildLeftLeg() = 0;virtual void BuildRightLeg() = 0;};//构造瘦人class ThinBuilder : public Builder{public:void BuildHead() { cout<<"build thin body"<<endl; }void BuildBody() { cout<<"build thin head"<<endl; }void BuildLeftArm() { cout<<"build thin left arm"<<endl; }void BuildRightArm() { cout<<"build thin right arm"<<endl; }void BuildLeftLeg() { cout<<"build thin left leg"<<endl; }void BuildRightLeg() { cout<<"build thin right leg"<<endl; }};//构造胖人 class FatBuilder : public Builder{public:void BuildHead() { cout<<"build fat body"<<endl; }void BuildBody() { cout<<"build fat head"<<endl; }void BuildLeftArm() { cout<<"build fat left arm"<<endl; }void BuildRightArm() { cout<<"build fat right arm"<<endl; }void BuildLeftLeg() { cout<<"build fat left leg"<<endl; }void BuildRightLeg() { cout<<"build fat right leg"<<endl; }};//构造的指挥官class Director{public:Director(Builder* builder) : m_builder(builder) {}void Create() {m_builder->BuildHead();m_builder->BuildBody();m_builder->BuildLeftArm();m_builder->BuildRightArm();m_builder->BuildLeftLeg();m_builder->BuildRightLeg();}private:Builder*m_builder;};int main(){ThinBuilder* thin = new ThinBuilder();Director* director = new Director(thin);director->Create();delete thin;delete director;return 0;}
优点
1).隔离了构建的步骤和具体的实现,为产品的具体实现提供了灵活度。
2).封装和抽象了每个步骤的实现,实现了依赖倒转原则。
3).封装了具体的步骤,减少了代码的冗余。
缺点
要求构建产品的步骤(算法)是不能剧烈变化的,最好是不变的,这样就影响了灵活度。
0 0
- Builder 建造者模式
- 建造者模式
- 设计模式-------建造者
- 建造者模式
- 建造者模式(Builder)
- 建造者模式(Builder)
- 建造者模式
- 建造者模式 - builder
- 建造者模式
- Builder建造者模式
- 建造者模式(Builder)
- 建造者模式(builder)
- 建造者模式
- java建造者模式
- 建造者模式
- 建造者模式
- 建造者模式(Builder)
- 建造者模式
- Linux指令
- PL/SQL中的循环(很low,以后慢慢完善)
- Linux下socket编程之TCP简单实现
- Coroutine协同函数与资源加载
- 数据库全部删除方式 delete truncate
- 建造者模式
- 单页应用跳转实现浅析-讨论篇
- 使用jQuery实现简单的tab栏标签切换
- 变量 函数声明
- 如何管理90后员工?
- CSS样式选择器分类(0)
- shadowsocks优惠码
- 在Ubuntu 14.04 上安装 Nginx-RTMP 流媒体服务器,并Android真机测试
- 错误:device eth0 does not seem to be present, delaying initialization