DesignPattern/04.BuilderPattern/2.Code/BuilderPattern.h

145 lines
2.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#ifndef __BUILDER_PATTERN__
#define __BUILDER_PATTERN__
#include <iostream>
#include <string.h>
using namespace std;
//<2F><>Ʒ<EFBFBD><C6B7>House
class House
{
public:
House() {}
void setFloor(string iFloor) {
this->floor = iFloor;
}
void setWall(string iWall) {
this->wall = iWall;
}
void setRoof(string iRoof) {
this->roof = iRoof;
}
//<2F><>ӡHouse<73><65>Ϣ
void printfHouseInfo() {
printf("Floor:%s\t\n", this->floor.c_str());
printf("Wall:%s\t\n", this->wall.c_str());
printf("Roof:%s\t\n", this->roof.c_str());
}
private:
string floor;
string wall;
string roof;
};
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>AbstractBall
class AbstractBuilder
{
public:
AbstractBuilder() {
house = new House();
}
virtual ~AbstractBuilder()
{
if (house != nullptr)
{
delete house;
house = nullptr;
}
}
//<2F><><EFBFBD>󷽷<EFBFBD><F3B7BDB7><EFBFBD>
virtual void buildFloor() = 0;
virtual void buildWall() = 0;
virtual void buildRoof() = 0;
virtual House *getHouse() = 0;
House *house;
};
//<2F><><EFBFBD><EFBFBD><E5BDA8><EFBFBD><EFBFBD>ConcreteBuilderA
class ConcreteBuilderA :public AbstractBuilder
{
public:
ConcreteBuilderA() {
printf("ConcreteBuilderA\n");
}
~ConcreteBuilderA()
{
if (this->house != nullptr)
{
delete house;
house = nullptr;
}
}
//<2F><><EFBFBD><EFBFBD>ʵ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
void buildFloor() {
this->house->setFloor("Floor_A");
}
void buildWall() {
this->house->setWall("Wall_A");
}
void buildRoof() {
this->house->setRoof("Roof_A");
}
House *getHouse() {
return this->house;
}
};
//<2F><><EFBFBD><EFBFBD><E5BDA8><EFBFBD><EFBFBD>ConcreteBuilderB
class ConcreteBuilderB :public AbstractBuilder
{
public:
ConcreteBuilderB() {
printf("ConcreteBuilderB\n");
}
~ConcreteBuilderA()
{
if (this->house != nullptr)
{
delete house;
house = nullptr;
}
}
//<2F><><EFBFBD><EFBFBD>ʵ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
void buildFloor() {
this->house->setFloor("Floor_B");
}
void buildWall() {
this->house->setWall("Wall_B");
}
void buildRoof() {
this->house->setRoof("Roof_B");
}
House *getHouse() {
return this->house;
}
};
//ָ<><D6B8><EFBFBD><EFBFBD>Director
class Director
{
public:
Director() :builder(nullptr) {}
~Director()
{
if (this->builder != nullptr)
{
delete builder;
builder = nullptr;
}
}
//<2F><><EFBFBD><EFBFBD>ʵ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
void setBuilder(AbstractBuilder *iBuilder) {
this->builder = iBuilder;
}
House *construct() {
builder->buildFloor();
builder->buildWall();
builder->buildRoof();
return builder->getHouse();
}
private:
AbstractBuilder *builder;
};
#endif //__BUILDER_PATTERN__