1. 程式人生 > >設計模式---建造者模式【含例項】

設計模式---建造者模式【含例項】

建造者模式(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