设计模式:13 建造者模式
来源:互联网 发布:平面设计软件cdr 编辑:程序博客网 时间:2024/05/17 09:45
建造者模式:
将复杂对象的构件与它的表示分离,使得同样的构件过程可以创建不同的表示。
用户只需要指定需要建造的类型就可以得到它们,具体的过程和细节不需要知道。
Builder:为创建一个Product对象的各个部件指定的抽象接口。
ConcreteBuilder:具体建造者,实现Builder接口,构造和装配各个部件
Product:具体的产品
Director:指挥者,构建一个使用Builder接口的对象,用于构建复杂对象,
优点:使得建造代码和表示代码分离,建造者隐藏了产品如何组装,若需要改变产品内部表示,定义具体建造者即可。
总结:建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。
main.cpp
#include <iostream>#include <stdlib.h>#include <memory>#include "PersonBuilder.h"#include "PersonDirector.h"#include "PersonThinBuilder.h"#include "PersonFatBuilder.h"using namespace std;void process(){PersonThinBuilder personThinBuilder("瘦子");PersonFatBuilder personFatBuilder("胖子");PersonDirector personThinDirector(personThinBuilder);personThinDirector.createPerson();PersonDirector personFatDirector(personFatBuilder);personFatDirector.createPerson();}int main(int argc,char* argv[]){process();system("pause");return 0;}
PersonBuilder.h
#ifndef PERSONBUILDER_H#define PERSONBUILDER_H#include <string>class PersonBuilder{public:PersonBuilder(const std::string& sName);virtual ~PersonBuilder(void);virtual void buildHead();virtual void buildBody();virtual void buildArmLeft();virtual void buildArmRight();virtual void buildLegLeft();virtual void buildLegRight();protected:std::string _sName;};#endif
PersonBuilder.cpp
#include "PersonBuilder.h"PersonBuilder::PersonBuilder(const std::string& sName):_sName(sName){}PersonBuilder::~PersonBuilder(void){}void PersonBuilder::buildHead(){}void PersonBuilder::buildBody(){}void PersonBuilder::buildArmLeft(){}void PersonBuilder::buildArmRight(){}void PersonBuilder::buildLegLeft(){}void PersonBuilder::buildLegRight(){}
PersonFatBuilder.h
#ifndef PERSONFATBUILDER_H#define PERSONFATBUILDER_H#include <string>#include "personbuilder.h"class PersonFatBuilder :public PersonBuilder{public:PersonFatBuilder(const std::string& sName);~PersonFatBuilder(void);void buildHead();void buildBody();void buildArmLeft();void buildArmRight();void buildLegLeft();void buildLegRight();};#endif
PersonFatBuilder.cpp
<p>#include "PersonFatBuilder.h"#include <iostream></p><p>using namespace std;</p><p>PersonFatBuilder::PersonFatBuilder(const std::string& sName):PersonBuilder(sName){}</p><p>PersonFatBuilder::~PersonFatBuilder(void){}</p><p>void PersonFatBuilder::buildHead(){ cout << _sName << " 构建头部" << endl;}</p><p>void PersonFatBuilder::buildBody(){ cout << _sName << " 构建身体" << endl;}</p><p>void PersonFatBuilder::buildArmLeft(){ cout << _sName << " 构建左手" << endl;}</p><p>void PersonFatBuilder::buildArmRight(){ cout << _sName << " 构建右手" << endl;}</p><p>void PersonFatBuilder::buildLegLeft(){ cout << _sName << " 构建左腿" << endl;}</p><p>void PersonFatBuilder::buildLegRight(){ cout << _sName << " 构建右腿" << endl;}</p>
PersonThinBuilder.h
#ifndef PERSONTHINBUILDER_H#define PERSONTHINBUILDER_H#include <string>#include "personbuilder.h"class PersonThinBuilder :public PersonBuilder{public:PersonThinBuilder(const std::string& sName);~PersonThinBuilder(void);void buildHead();void buildBody();void buildArmLeft();void buildArmRight();void buildLegLeft();void buildLegRight();};#endif
PersonThinBuilder.cpp
#include "PersonThinBuilder.h"#include <iostream>using namespace std;PersonThinBuilder::PersonThinBuilder(const std::string& sName):PersonBuilder(sName){}PersonThinBuilder::~PersonThinBuilder(void){}void PersonThinBuilder::buildHead(){cout << _sName << " 构建头部" << endl;}void PersonThinBuilder::buildBody(){cout << _sName << " 构建身体" << endl;}void PersonThinBuilder::buildArmLeft(){cout << _sName << " 构建左手" << endl;}void PersonThinBuilder::buildArmRight(){cout << _sName << " 构建右手" << endl;}void PersonThinBuilder::buildLegLeft(){cout << _sName << " 构建左腿" << endl;}void PersonThinBuilder::buildLegRight(){cout << _sName << " 构建右腿" << endl;}
PersonDirector.h
#ifndef PERSONDIRECTOR_H#define PERSONDIRECTOR_H#include "PersonBuilder.h"#include <memory>class PersonDirector{public:PersonDirector(PersonBuilder& personBuilder);~PersonDirector(void);void createPerson();private:std::shared_ptr<PersonBuilder> _ptrPersonBuilder;//PersonBuilder _personBuilder;};#endif
PersonDirector.cpp
#include "PersonDirector.h"PersonDirector::PersonDirector(PersonBuilder& personBuilder)//:_personBuilder(personBuilder){_ptrPersonBuilder.reset(&personBuilder);}PersonDirector::~PersonDirector(void){}void PersonDirector::createPerson(){_ptrPersonBuilder->buildHead();_ptrPersonBuilder->buildBody();_ptrPersonBuilder->buildArmLeft();_ptrPersonBuilder->buildArmRight();_ptrPersonBuilder->buildLegLeft();_ptrPersonBuilder->buildLegRight();/*_personBuilder.buildHead();_personBuilder.buildBody();_personBuilder.buildArmLeft();_personBuilder.buildArmRight();_personBuilder.buildLegLeft();_personBuilder.buildLegRight();*/}
0 0
- 设计模式:13 建造者模式
- 大话设计模式13----建造者模式
- 设计模式-------建造者
- 设计模式-建造者
- 建造者设计模式
- 建造者设计模式
- 建造者设计模式
- 设计模式-建造者
- 建造者设计模式
- 建造者设计模式
- 建造者设计模式
- [设计]建造者模式
- 设计模式:建造者模式
- 设计模式---建造者模式
- 设计模式---建造者模式
- 设计模式-----建造者模式
- 设计模式-【建造者模式】
- 设计模式--建造者模式
- Java泛型-类型擦除
- Android之手机闹钟
- 【CCF】找相反数
- springmvc中url-url-pattern /和/*的区别
- HEAP CORRUPTION DETECTED
- 设计模式:13 建造者模式
- linux chmod命令参数及用法详解--文件文件夹权限
- selenium抓取元素排除某个特定的class标签
- 如何只在堆或者栈上分配类对象
- Java日志框架——Logback的使用注意
- 脱机数据认证
- Linux下Jmeter后台分布式执行
- quick - lua 分辨率适配
- 用RED5做直播