您的位置:首页 > 编程语言 > C语言/C++

23种设计模式C++实例之创建者模式

2015-12-11 19:32 465 查看
把建造不同类型房子的过程与客户端调用分类

#include <iostream>

using namespace std;

/*
* 建造者模式
* 对象的创建和对象的表示分离
* */

class House {
public:
void setFloor(string floor) {
m_floor = floor;
}
void setWall(string wall) {
m_wall = wall;
}
void setDoor(string door) {
m_door = door;
}
void show() {
cout << m_floor << endl;
cout << m_wall << endl;
cout << m_door << endl;
}
private:
string m_floor;
string m_wall;
string m_door;
};

class Builder {
public:
virtual ~Builder() {}
virtual void makeFloor() = 0;
virtual void makeWall() = 0;
virtual void makeDoor() = 0;
virtual House* getHouse() = 0;
};

class FlatBuilder: public Builder {
public:
FlatBuilder() {
m_house = new House();
}
virtual ~FlatBuilder() {
if (m_house != NULL) {
delete m_house;
m_house = NULL;
}
}
void makeFloor() {
m_house->setFloor("flat floor");
}

void makeWall() {
m_house->setWall("flat wall");
}

void makeDoor() {
m_house->setDoor("flat door");
}

House* getHouse() {
return m_house;
}
private:
House* m_house;
};

class VillaBuilder: public Builder {
public:
VillaBuilder() {
m_house = new House();
}
virtual ~VillaBuilder() {
if (m_house != NULL) {
delete m_house;
m_house = NULL;
}
}
void makeFloor() {
m_house->setFloor("villa floor");
}

void makeWall() {
m_house->setWall("villa wall");
}

void makeDoor() {
m_house->setDoor("villa door");
}

House* getHouse() {
return m_house;
}
private:
House* m_house;
};

class Director {
public:
Director(Builder* builder) {
m_builder = builder;
}
void construct() {
m_builder->makeFloor();
m_builder->makeWall();
m_builder->makeDoor();
}
private:
Builder* m_builder;
};

int main() {
Director* director = NULL;
Builder* builder = NULL;
House* house = NULL;

builder = new VillaBuilder;
director = new Director(builder);
director->construct();
house = builder->getHouse();
house->show();

delete builder;
delete director;

builder = new FlatBuilder;
director = new Director(builder);
director->construct();
house = builder->getHouse();
house->show();

delete builder;
delete director;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: