設計模式---建造者模式【含例項】
阿新 • • 發佈:2018-11-07
建造者模式(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
參考網上資料: