创建型模式-生成器(builder)
来源:互联网 发布:安卓优化软件排行榜 编辑:程序博客网 时间:2024/05/01 02:48
生成器
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.
实例
main.cc:
/*design_patterns:"builder"In the production of mobile phones, for example, now the mobile phone manufacturers will launch high-end, midrange, low-end configuration version, the basic configuration of most of them, only a few key parts are different, it is very suitable for the use of Builder modehigh-end :835 Processor,5.5 inch Panel,8G Memory.midrange :820 Processor,4.7 inch Panel,4G Memory.low-end :810 Processor,4.0 inch Panel,2G Memory.*/#include "builder.h"#include "high_phone_builder.h"#include "normal_phone_builder.h"#include "low_phone_builder.h"#include "director.h"#include "phone.h"#include <windows.h>#include <iostream>void main(){ //create director Director *director = new Director(); Builder *high_builder = new HighPhoneBuilder(); director->SetBuilder(high_builder); //create high-end phone Phone *high_phone = director->AssemblePhone(); high_phone->ShowConfig(); Builder *normal_builder = new NormalPhoneBuilder(); director->SetBuilder(normal_builder); //create midrange phone Phone *normal_phone = director->AssemblePhone(); normal_phone->ShowConfig(); Builder *low_builder = new LowPhoneBuilder(); director->SetBuilder(low_builder); //create low-end phone Phone *low_phone = director->AssemblePhone(); low_phone->ShowConfig(); //clear delete high_builder; delete normal_builder; delete low_builder; delete director; cout << "ending!" << endl; system("Pause");}
Director:
//director.h#ifndef HELENDP_SOURCE_DIRECTOR_H_#define HELENDP_SOURCE_DIRECTOR_H_#include "phone.h"#include "builder.h"class Director{public: Director(); ~Director(); Phone *AssemblePhone(); void SetBuilder(Builder *builder);private: Builder *builder_;};#endif//director.cc#include "director.h"#include "builder.h"Director::Director(){}Director::~Director(){}Phone *Director::AssemblePhone(){ builder_->AssembleStepOne(); builder_->AssembleStepTwo(); builder_->AssembleStepThree(); return builder_->GetPhone();}void Director::SetBuilder(Builder *builder){ builder_ = builder;}
Builder:
//builder.h#ifndef HELENDP_SOURCE_BUILDER_H_#define HELENDP_SOURCE_BUILDER_H_#include <string>#include "phone.h"using namespace std;class Builder{public: Builder(); virtual ~Builder(); virtual void AssembleStepOne() = 0; virtual void AssembleStepTwo() = 0; virtual void AssembleStepThree() = 0; virtual Phone* GetPhone() = 0;};#endif//builder.cc#include "builder.h"#include <iostream>using namespace std;Builder::Builder(){}Builder::~Builder(){}
HighPhoneBuilder:
//high_phone_builder.h#ifndef HELENDP_SOURCE_HIGH_PHONE_BUILDER_H_#define HELENDP_SOURCE_HIGH_PHONE_BUILDER_H_#include "builder.h"#include "Phone.h"class HighPhoneBuilder:public Builder{public: HighPhoneBuilder(); ~HighPhoneBuilder(); void AssembleStepOne(); void AssembleStepTwo(); void AssembleStepThree(); Phone* GetPhone();private: Phone *phone_;};#endif//high_phone_builder.cc#include "high_phone_builder.h"HighPhoneBuilder::HighPhoneBuilder(){ phone_ = new Phone();}HighPhoneBuilder::~HighPhoneBuilder(){ delete phone_;}void HighPhoneBuilder::AssembleStepOne(){ phone_->AssembleProcessor("SnapDragon835");}void HighPhoneBuilder::AssembleStepTwo(){ phone_->AssembleMemory("8G Memory");}void HighPhoneBuilder::AssembleStepThree(){ phone_->AssemblePanel("5.5 inch panel");}Phone* HighPhoneBuilder::GetPhone(){ return phone_;}
LowPhoneBuilder:
//low_phone_builder.h#ifndef HELENDP_SOURCE_LOW_PHONE_BUILDER_H_#define HELENDP_SOURCE_LOW_PHONE_BUILDER_H_#include "builder.h"#include "phone.h"class LowPhoneBuilder:public Builder{public: LowPhoneBuilder(); ~LowPhoneBuilder(); void AssembleStepOne(); void AssembleStepTwo(); void AssembleStepThree(); Phone* GetPhone();private: Phone* phone_;};#endif//low_phone_builder.cc#include "low_phone_builder.h"LowPhoneBuilder::LowPhoneBuilder(){ phone_ = new Phone();}LowPhoneBuilder::~LowPhoneBuilder(){ delete phone_;}void LowPhoneBuilder::AssembleStepOne(){ phone_->AssembleProcessor("SnapDragon810");}void LowPhoneBuilder::AssembleStepTwo(){ phone_->AssembleMemory("2G Memory");}void LowPhoneBuilder::AssembleStepThree(){ phone_->AssemblePanel("4.0 inch panel");}Phone* LowPhoneBuilder::GetPhone(){ return phone_;}
NormalPhoneBuilder:
//normal_phone_builder.h#ifndef HELENDP_SOURCE_NORMAL_PHONE_BUILDER_H_#define HELENDP_SOURCE_NORMAL_PHONE_BUILDER_H_#include "builder.h"#include "phone.h"class NormalPhoneBuilder:public Builder{public: NormalPhoneBuilder(); ~NormalPhoneBuilder(); void AssembleStepOne(); void AssembleStepTwo(); void AssembleStepThree(); Phone* GetPhone();private: Phone* phone_;};#endif//normal_phone_builder.cc#include "normal_phone_builder.h"NormalPhoneBuilder::NormalPhoneBuilder(){ phone_ = new Phone();}NormalPhoneBuilder::~NormalPhoneBuilder(){ delete phone_;}void NormalPhoneBuilder::AssembleStepOne(){ phone_->AssembleProcessor("SnapDragon820");}void NormalPhoneBuilder::AssembleStepTwo(){ phone_->AssembleMemory("4G Memory");}void NormalPhoneBuilder::AssembleStepThree(){ phone_->AssemblePanel("4.7 inch panel");}Phone* NormalPhoneBuilder::GetPhone(){ return phone_;}
Phone:
//phone.h#ifndef HELENDP_SOURCE_PHONE_H_#define HELENDP_SOURCE_PHONE_H_#include <string>using namespace std;/*Mobile phone includes processor, memory, panel and other basic configuration*/class Phone{public: Phone(); ~Phone(); void AssembleProcessor(string processor); void AssembleMemory(string memory); void AssemblePanel(string panel); void ShowConfig();private: string processor_; string memory_; string panel_; string base_config_;};#endif//phone.cc#include "phone.h"#include <iostream>using namespace std;Phone::Phone(){ base_config_ = "base config";}Phone::~Phone(){}void Phone::AssembleProcessor(string processor){ processor_ = processor;}void Phone::AssembleMemory(string memory){ memory_ = memory;}void Phone::AssemblePanel(string panel){ panel_ = panel;}void Phone::ShowConfig(){ cout << "ShowConfig:" << endl; cout << base_config_ << endl; cout << processor_ << endl; cout << memory_ << endl; cout << panel_ << endl << endl;}
代码和UML图(EA)工程文件,最后会整理打包上传.
UML类图
结构
- Director(Director):指挥者
- Builder(Builder):抽象建造者
- ConcreteBuilder(HighPhoneBuilder,LowPhoneBuilder,NormalPhoneBuilder):具体建造者
- Product(Phone):产品角色
优点
- 在建造者模式中, 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象.
- 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象.
- 可以更加精细地控制产品的创建过程 .将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程.
- 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”.
缺点
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制.
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大.
0 0
- Builder生成器(创建型模式)
- Builder生成器(创建型模式)
- 【创建型模式】builder(生成器)
- 创建型模式-生成器(builder)
- Builder 生成器模式(创建型模式)
- Builder 生成器(创建型模式)
- 4.Builder 生成器(创建型模式)
- Builder(生成器)---对象创建型模式
- 三、Builder 生成器模式(创建型)
- 创建型模式:Builder(生成器)
- Builder 生成器(创建型模式) 笔记
- 设计模式-创建型-builder生成器
- 三、生成器模式Builder(创建型)
- 设计模式之生成器(Builder)----对象创建型模式
- 创建型模式——生成器模式(Builder Pattern)
- 设计模式-创建型模式之 Builder(生成器)
- 【设计模式基础】创建型模式 - 5 - 生成器(Builder)
- 【设计模式】创建型模式之生成器Builder
- 1134求最大值
- 数据结构-从归并排序到数组的逆序对数(微软面试题)
- ResultSet类—结果集容易忽略的问题
- 1056这道题不能做
- 一个使用纯Win32 SDK和C语言实现的五子棋游戏
- 创建型模式-生成器(builder)
- leetcode_14. Longest Common Prefix
- Android应用层View绘制流程与源码分析
- 动态规划(LCS)(POJ 2250 Compromise)
- 字符串统计
- Python 网络编程/(有连接)
- 数值统计
- 如何转载CSDN上的博文
- Exchange Web Service(EWS) 协议同步邮件