博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
06.建造者模式--Builder
阅读量:2393 次
发布时间:2019-05-10

本文共 2962 字,大约阅读时间需要 9 分钟。

原文地址:

Builder模式:

Builder模式将一个复杂对象的构建与它的表示分离使得同样的构建过程可以创建不同的表示

当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开来,这样做的好处就是通过一步步的进行复杂对象的构建,由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。 Builder模式要解决的也正是这样的问题。

Builder模式主用用于创建一些复杂的对象,这些对象内部间的建造顺序同行是稳定的,但对象内部的构造通常面临着复杂的变化。Builder模式使得建造代码与表示代码分离,由于Builder模式隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。

《大话设计模式》中,对于Builder模式的实现代码是用的画一个人为例子,将画一个人的构建顺序分为画头,画躯干,画四肢三个过程。不同的构建产生的不同高矮胖瘦的人就是不同的产品。

而更通俗的说法是《设计模式精解-GoF 23种设计模式解析》中说的,要完成大学教育,一般将大学教育过程分成4个学期进行,因此没有学习可以看作是构建完整大学教育的一个部分构建过程,每个人经过这4年的(4个阶段)构建过程得到的最后的结果不一样,因为可能在四个阶段的构建中引入了很多的参数(每个人的机会和际遇不完全相同)。

Builder模式的典型结构图为:

 

这里以画一个人为例子,实现Buider模式,下面是实现代码:

//Product.h#ifndef _PRODUCT_H_#define _PRODUCT_H_class CHuman{public: CHuman(); ~CHuman();protected:private:};#endif //~_PRODUCT_H_ #include "Product.h"#include 
using namespace std;CHuman::CHuman(){ cout << "构建一个人" << endl;} //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_H_ //Director.cpp#include "director.h"#include "Builder.h"Director::Director(Builder* bld){ _bld = bld;}Director::~Director(){}void Director::Construct(){ _bld->BuildHead("user-defined"); _bld->BuildBody("user-defined"); _bld->BuildLimbs("user-defined");} //Builder.h#ifndef _BUILDER_H_#define _BUILDER_H_#include
using namespace std;class CHuman;// 构建者class Builder{public: virtual ~Builder(); virtual void BuildHead(const string& buildPara) = 0; virtual void BuildBody(const string& buildPara) = 0; virtual void BuildLimbs(const string& buildPara) = 0; virtual CHuman* GetProduct() = 0;protected: Builder();private:};// 胖人的构建者class FatManBuilder:public Builder{public: FatManBuilder(); ~FatManBuilder(); void BuildHead(const string& buildPara); void BuildBody(const string& buildPara); void BuildLimbs(const string& buildPara); CHuman* GetProduct();protected:private:};// 瘦人的构建者class ThinManBuilder:public Builder{public: ThinManBuilder(); ~ThinManBuilder(); void BuildHead(const string& buildPara); void BuildBody(const string& buildPara); void BuildLimbs(const string& buildPara); CHuman* GetProduct();protected:private:};#endif //~_BUILDER_H_ //Builder.cpp#include "Builder.h"#include "Product.h"#include
using namespace std;Builder::Builder(){}Builder::~Builder(){}FatManBuilder::FatManBuilder(){}FatManBuilder::~FatManBuilder(){}void FatManBuilder::BuildHead(const string& buildPara){ cout<<"Step1:BuildHead...胖头, "<
<
using namespace std;int main(int argc,char* argv[]){ Builder *pBuilder1 = new FatManBuilder(); Director* d1 = new Director(pBuilder1); d1->Construct(); Builder *pBuilder2 = new ThinManBuilder(); Director* d2 = new Director(pBuilder2); d2->Construct(); Builder *pBuilder3 = new FatManBuilder(); pBuilder3->GetProduct(); Builder *pBuilder4 = new ThinManBuilder(); pBuilder4->GetProduct(); return 0;}

你可能感兴趣的文章
Preventing Cross-site Scripting Attacks
查看>>
WASC Distributed Web Honeypots Project Update
查看>>
安装pydev到eclipse
查看>>
[WAF]apache和modsecurity的安装
查看>>
写给换工作和找工作的同学
查看>>
Island Hopping the SpiderLabs Way
查看>>
Top Ten Web Protection Techniques of 2011
查看>>
Faster Blind MySQL Injection Using Bit Shifting
查看>>
Safely Dumping Hashes from Live Domain Controllers
查看>>
sgx模拟器
查看>>
SGX相关资源
查看>>
nessus 购买地址
查看>>
Google Security Architecture
查看>>
web server信息收集(附带plesk xday)
查看>>
JBoss AS Administrative Console Password Disclosure
查看>>
Securely Developing on Mobile
查看>>
ModSecurity Updates: Nginx Stable Release and Google Summer of Code Participation
查看>>
Java Web 三层架构详解
查看>>
iphone for PPT遥控器 MyPoint PowerPoint Remote
查看>>
ZPanel 10.0.0.2 Remote Command Execution
查看>>