设计模式---建造者模式【含实例】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30042269/article/details/83818107

建造者模式(Client、Director、Builder和Product

 Builder负责Product类对象的具体过程构建,Director负责指导Build,要求Builder按照其指定的顺序去完成Product的构造。最后通过Builder返回建造后的结果。

适用场景

 简单地说,就好象我要一座房子住,可是我不知道怎么盖(简单的砌墙,层次较低),也不知道怎么样设计(建几个房间,几个门好看,层次较高),于是我需要找一帮民工,他们会砌墙,还得找个设计师,他知道怎么设计,我还要确保民工听设计师的领导,而设计师本身也不干活,光是下命令,这里砌一堵墙,这里砌一扇门,这样民工开始建设,最后,我可以向民工要房子了。在这个过程中,设计师是什么也没有,除了他在脑子里的设计和命令,所以要房子也是跟民工要,记住了!(转,觉得比较容易理解)。

分析

IBuilder(抽象建造者):创建一个产品对象的各个部件指定抽象接口, 包含建造各部件的方法。
Builder_CottageStyle(具体建造者):实现 IBuilder 的接口,并提供一个输出完成后产品的接口。
Director(指挥者):构造一个使用 IBuilder 接口的对象,内部调用IBuilder对象建造产品。
Room(产品):输出的产品。

代码

//main.h
#ifndef MAIN_H
#define MAIN_H
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include "unistd.h"
#define RELEASE(p) {if(p) {delete p; p = NULL;}}

//////////////定义产品Room//////////////
class Room
{
public:
    void setFloor(std::string floor){m_floor = floor;}
    void setDoor(std::string door){m_door = door;}

    std::string getFloor(){return m_floor;}
    std::string getDoor(){return m_door;}


private:
    std::string m_floor;
    std::string m_door;
};

//////////////定义抽象建造者//////////////
class IBuilder
{
public:
    virtual ~IBuilder(){}
    virtual void buildDoor() = 0;
    virtual void buildFloor() = 0;
    virtual Room * getRoom() = 0;
};

////////////////定义设计者////////////////
class Director
{
public:
    Director(){}
    void Create(IBuilder* builder) {
        builder->buildDoor();
        builder->buildFloor();
    }
};

//////////////定义具体建造者//////////////
class Builder_traditionalStyle:public IBuilder
{
public:
    Builder_traditionalStyle(){m_room = new Room();}
    virtual ~Builder_traditionalStyle(){RELEASE(m_room);}
    virtual void buildDoor();
    virtual void buildFloor();
    virtual Room * getRoom();
private:
    Room* m_room;
};

//////////////定义具体建造者//////////////
class Builder_CottageStyle:public IBuilder
{
public:
    Builder_CottageStyle(){m_room = new Room();}
    virtual ~Builder_CottageStyle(){RELEASE(m_room);}
    virtual void buildDoor();
    virtual void buildFloor();
    virtual Room * getRoom();
private:
    Room* m_room;
};

#endif // MAIN_H
//main.cpp
#include "main.h"

//////Builder_traditionalStyle////////
void Builder_traditionalStyle::buildDoor()
{
    m_room->setDoor("black");
}

void Builder_traditionalStyle::buildFloor()
{
    m_room->setFloor("brown");
}

Room* Builder_traditionalStyle::getRoom()
{
    return m_room;
}

//////Builder_CottageStyle////////
void Builder_CottageStyle::buildDoor()
{
    m_room->setDoor("yellow");
}

void Builder_CottageStyle::buildFloor()
{
    m_room->setFloor("white");
}

Room* Builder_CottageStyle::getRoom()
{
    return m_room;
}


int main(int argc, char *argv[])
{
    std::cout<<"========Hello======"<<std::endl;
    //创建设计师
    Director* dir = new Director();

    //创建房屋建造者
    IBuilder* builder_cottageStyle = new Builder_CottageStyle();
    IBuilder* builder_traditionalStyle = new Builder_traditionalStyle();

    //设计师指挥建造
    dir->Create(builder_cottageStyle);

    //从建造者获得建好的房屋
    Room* room = builder_cottageStyle->getRoom();
    std::cout<<"[Room]door:"<<room->getDoor()<<std::endl;
    std::cout<<"[Room]floor:"<<room->getFloor()<<std::endl;

    RELEASE(dir);
    RELEASE(builder_cottageStyle);
    RELEASE(builder_traditionalStyle);
    RELEASE(room);
    return 0;
}

输出

========Hello======
[Room]door:yellow
[Room]floor:white

参考网上资料:

https://blog.csdn.net/u011012932/article/details/66968761

https://www.cnblogs.com/lwbqqyumidi/p/3742562.html

猜你喜欢

转载自blog.csdn.net/qq_30042269/article/details/83818107