[GoF设计模式]Builder模式和Facade模式的C++实现

昨天晚上寝室断网了,今天补发。

@【Builder模式】

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

【图解】

[GoF设计模式]Builder模式和Facade模式的C++实现_第1张图片

【程序】

/******************************************************************* * * DESCRIPTION: VehicleBuilder Class ,[抽象创建者] * * AUTHOR:Neesky * * DATE:2009-9-21 * *******************************************************************/ #ifndef VEHICLEBUILDER_H_ #define VEHICLEBUILDER_H_ class VehicleBuilder { public: /*constructor and destructor*/ VehicleBuilder(){} virtual ~VehicleBuilder(){} virtual void getVehicle()=0; //Assemble vehicle and deliver protected: /*create parts function*/ virtual void createFrame()=0;//Create Parts virtual void createChassis()=0; virtual void createTyre()=0; }; #endif

/******************************************************************* * * DESCRIPTION: CarBuilder Class ,[具体创建者] * * AUTHOR:Neesky * * DATE:2009-9-21 * *******************************************************************/ #ifndef CARBUILDER_H_ #define CARBUILDER_H_ /** include files **/ #include #include "VehicleBuilder.h" #include "Car.h" using namespace std; class CarBuilder:public VehicleBuilder { public: /*constructor and destructor*/ CarBuilder() { this->_car=NULL; } virtual ~CarBuilder() { if(_car!=NULL) delete _car; } virtual void getVehicle() { cout<<"Car being built......"<createFrame(); this->createChassis(); this->createTyre(); cout<<"Car assembling......"<_car=new Car(); cout<<"*******Now, It can be diliveried!......"<

/******************************************************************* * * DESCRIPTION: Trunck Builder, [具体创建者] * * AUTHOR:Neesky * * DATE:2009-9-21 * *******************************************************************/ #ifndef TRUCKBUILDER_H_ #define TRUCKBUILDER_H_ /** include files **/ #include "VehicleBuilder.h" #include "Truck.h" class TruckBuilder:public VehicleBuilder { public: /*constructor and destructor*/ TruckBuilder() { this->_truck=NULL; } virtual ~TruckBuilder() { if(_truck!=NULL) delete _truck; } virtual void getVehicle() { cout<<"Truck being built......"<createFrame(); this->createChassis(); this->createTyre(); cout<<"Truck assembling......"<_truck=new Truck(); cout<<"*******Now, It can be diliveried!......"<

/******************************************************************* * * DESCRIPTION: Manager Class, the director of Builder[厂长/经理] * * AUTHOR:Neesky * * DATE:2009-9-21 * *******************************************************************/ #ifndef MANAGER_H_ #define MANAGER_H_ /** include files **/ #include "VehicleBuilder.h" #include "CarBuilder.h" #include "TruckBuilder.h" class Manager { public: /*Constructor and destructor*/ Manager(VehicleBuilder *carBuilder,VehicleBuilder *truckBuilder) { this->_carBuilder=carBuilder; this->_truckBuilder=truckBuilder; } virtual ~Manager() { if(_carBuilder!=NULL)delete _carBuilder; if(_truckBuilder!=NULL)delete _truckBuilder; } /*Manager ask the car workshop to produce car*/ void AskBuilder_toProduceCar() { this->_carBuilder->getVehicle(); return; } /*Manager ask the truck workshop to produce truck*/ void AskBuilder_toProduceTruck() { this->_truckBuilder->getVehicle(); return; } private: /*The Mananger has 2 workshop(builder)*/ VehicleBuilder *_carBuilder; VehicleBuilder *_truckBuilder; }; #endif

/******************************************************************* * * DESCRIPTION:Car Class [产品类] * * AUTHOR:Neesky * * DATE:2009-9-21 * *******************************************************************/ #ifndef CAR_H_ #define CAR_H_ #include using namespace std; class Car { public: Car() { cout<<"Car Now Completed!"<

/******************************************************************* * * DESCRIPTION:Truck Class [产品类] * * AUTHOR:Neesky * * DATE:2009-9-21 * *******************************************************************/ #ifndef TRUCK_H_ #define TRUCK_H_ #include using namespace std; class Truck { public: Truck() { cout<<"Truck Now Completed!"<

/******************************************************************* * * DESCRIPTION:Builder Pattern [创建者模式] * * AUTHOR:Neesky * * DATE:2009-9-21 * *******************************************************************/ #include #include "Manager.h" #include "VehicleBuilder.h" #include "CarBuilder.h" #include "TruckBuilder.h" #include "Car.h" #include "Truck.h" using namespace std; int main (int argc, char *argv[]) { //Build the vehicle workshop VehicleBuilder *carBuilder=new CarBuilder(); VehicleBuilder *truckBuilder=new TruckBuilder(); //Here a manager comes to direct the workshops Manager *manager=new Manager(carBuilder,truckBuilder); cout<<"/n*******Now a client order a Car......"<AskBuilder_toProduceCar();//manager ask the car builder to produce a car cout<<"/n*******Now a client order a Truck......"<AskBuilder_toProduceTruck();//manager ask the truck builder to produce a truck return(0); }

 

【输出】

[GoF设计模式]Builder模式和Facade模式的C++实现_第2张图片

 

 

@【Facade模式】

Facade模式-门面模式的作用是

(1)为复杂的系统提供一个简单的接口

(2)将子系统和调用者或称客户相分离

(3)层次化的结构,减少层之间的依赖。

 

【图解】以病人去门诊治疗子系统(只简单的列出一个子系统)为例:

 [GoF设计模式]Builder模式和Facade模式的C++实现_第3张图片

 

【程序】

/******************************************************************* * * DESCRIPTION: FacadeWaiter Class [接待员类-门面类] * * AUTHOR:Neesky * * DATE:2009-9-21 * *******************************************************************/ #ifndef FACADEWAITER_H_ #define FACADEWAITER_H_ #include #include "Registe.h"//挂号 #include "Diagnose.h"//就诊 #include "Assay.h"//化验 #include "Medicine.h"//取药 using namespace std; class FacadeWaiter { public: /*constructor and destructor*/ FacadeWaiter() { this->_reg=new Registe(); this->_diag=new Diagnose(); this->_ass=new Assay(); this->_med=new Medicine(); } virtual ~FacadeWaiter() { if(this->_reg!=NULL)delete this->_reg; if(this->_diag!=NULL)delete this->_diag; if(this->_ass!=NULL)delete this->_ass; if(this->_med!=NULL)delete this->_med; } /*concreate functions*/ void ReceiveClient()//接待员接待顾客,帮助完成一系列手续 { /*挂号*/ this->_reg->start(); this->_reg->end(); /*就诊*/ this->_diag->start(); this->_diag->end(); /*化验*/ this->_ass->payBeforeAssay(); this->_ass->start(); this->_ass->end(); /*取药*/ this->_med->payBeforeMedicine(); this->_med->start(); this->_med->end(); return; } private: Registe *_reg; Diagnose *_diag; Assay *_ass; Medicine *_med; }; #endif

 /******************************************************************* * * DESCRIPTION: Registe Class [挂号] * * AUTHOR:Neesky * * DATE:2009-9-21 * *******************************************************************/ #ifndef REGISTE_H_ #define REGISTE_H_ #include using namespace std; class Registe { public: /*constructor and destructor*/ Registe(){} virtual ~Registe(){} /*concreate functions*/ void start() { cout<<"Registing[挂号]: Start......"<

/******************************************************************* * * DESCRIPTION: Diagnose Class [诊断] * * AUTHOR:Neesky * * DATE:2009-9-21 * *******************************************************************/ #ifndef DIAGNOSE_H_ #define DIAGNOSE_H_ #include using namespace std; class Diagnose { public: /*constructor and destructor*/ Diagnose(){} virtual ~Diagnose(){} /*concreate functions*/ void start() { cout<<"Diagnosing[就诊]:Start......"<

/******************************************************************* * * DESCRIPTION: Assay Class [化验] * * AUTHOR:Neesky * * DATE:2009-9-21 * *******************************************************************/ #ifndef ASSAY_H_ #define ASSAY_H_ #include using namespace std; class Assay { public: /*constructor and destructor*/ Assay(){} virtual ~Assay(){} /*concreate functions*/ void payBeforeAssay() { cout<<"Assay[化验]:Before assay,Pay[付款]......"<

/******************************************************************* * * DESCRIPTION: Medicine Class [取药] * * AUTHOR:Neesky * * DATE:2009-9-21 * *******************************************************************/ #ifndef MEDICINE_H_ #define MEDICINE_H_ #include using namespace std; class Medicine { public: /*constructor and destrutor*/ Medicine(){} virtual ~Medicine(){} /*concreate functions*/ void payBeforeMedicine() { cout<<"Medicine[取药]:Before medicine,Pay[付款]......"<

/******************************************************************* * * DESCRIPTION: Facade Pattern [门面模式] * * AUTHOR:Neesky * * DATE:2009-9-21 * *******************************************************************/ #include #include "FacadeWaiter.h" using namespace std; int main (int argc, char *argv[]) { /*Now Create the subsystem of Facade*/ FacadeWaiter *facadewaiter=new FacadeWaiter(); /*Now a Client come here*/ cout<<"/nA client come to subsystem for his illness!"<ReceiveClient(); return(0); }

 

【输出】

[GoF设计模式]Builder模式和Facade模式的C++实现_第4张图片

你可能感兴趣的:([GoF设计模式]Builder模式和Facade模式的C++实现)