设计模式: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
原创粉丝点击