文章目錄
- 建造者模式(Builder Pattern)概述
- 建造者模式UML圖
- 作用:
- 建造者模式的結構
- 產品(Product):
- 抽象建造者(Builder):
- 具體建造者(Concrete Builder):
- 指揮者(Director):
- C++ 代碼示例1
- C++示例代碼2
建造者模式(Builder Pattern)概述
定義:
建造者模式是一種創建型設計模式,它將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。也就是說,它把對象的創建邏輯和表示邏輯分離開來,讓代碼結構更加清晰,便于維護和擴展。
建造者模式UML圖
作用:
便于創建復雜對象:對于那些具有多個屬性、構造過程比較復雜的對象,使用建造者模式可以分步來構建對象,使創建過程更有條理。例如,創建一個包含多個部件的電腦對象,要配置 CPU、內存、硬盤等多種組件,通過建造者模式能清晰地完成配置過程。
提高代碼的可維護性和可讀性:把對象構建的各個步驟封裝在不同的方法中,相比于在構造函數中羅列大量參數或者在一個方法里寫復雜的初始化邏輯,代碼結構更加清晰,后續閱讀和維護代碼時更容易理解對象的構建流程。
實現不同的構建配置:可以通過不同的建造者實現來創建對象的不同配置版本,比如對于一款游戲角色,可以創建不同屬性配置的角色實例,滿足不同場景需求。
建造者模式的結構
產品(Product):
這是最終要創建的復雜對象,它通常包含多個部件或者屬性,比如上述提到的電腦對象,其內部有 CPU、內存、硬盤等不同的成員變量來構成完整的電腦實體。
抽象建造者(Builder):
它定義了創建產品各個部件的抽象方法,以及返回最終產品對象的抽象方法。比如對于電腦的抽象建造者,會有抽象的配置 CPU、配置內存等方法,還有獲取構建好的電腦的抽象方法。
具體建造者(Concrete Builder):
實現了抽象建造者中定義的抽象方法,具體地來構建產品的各個部件,按照特定的邏輯和配置完成產品的組裝,每個具體建造者可以創建出具有不同配置特點的產品。
指揮者(Director):
它負責指揮建造者進行對象的構建,通過調用建造者的相關方法來按順序完成產品的創建過程,不過它并不關心具體的構建細節,只是協調構建步驟。
C++ 代碼示例1
以下以創建一個簡單的電腦對象為例來展示建造者模式的代碼實現:
#include<iostream>
#include<string>// 產品類:電腦
class Computer
{
private:std::string cpu;int memory;int hardDisk;
public:void setCpu(const std::string& cpu){this->cpu = cpu;}void setMemory(int memory){this->memory = memory;}void setHardDisk(int hardDisk){this->hardDisk = hardDisk;}void showInfo(){std::cout << "CPU: " << cpu << std::endl;std::cout << "Memory: " << memory << "GB" << std::endl;std::cout << "Hard Disk: " << hardDisk << "GB" << std::endl;}
};// 抽象建造者類
class ComputerBuilder
{
public:virtual void buildCpu() = 0;virtual void buildMemory() = 0;virtual void buildHardDisk() = 0;virtual Computer* getComputer() = 0;
};// 具體建造者類,創建高配電腦
class HighEndComputerBuilder :public ComputerBuilder
{
private:Computer* computer;
public:HighEndComputerBuilder() {computer = new Computer();}void buildCpu() override{computer->setCpu("Intel Core i9");}void buildMemory() override{computer->setMemory(32);}void buildHardDisk() override{computer->setHardDisk(1024);}Computer* getComputer() override{return computer;}
};// 具體建造者類,創建低配電腦
class LowEndComputerBuilder : public ComputerBuilder
{
private:Computer* computer;
public:LowEndComputerBuilder(){computer = new Computer();}void buildCpu() override {computer->setCpu("Intel Core i3");}void buildMemory() override {computer->setMemory(8);}void buildHardDisk() override{computer->setHardDisk(256);}Computer* getComputer() override{return computer;}
};// 指揮者類
class Director
{
private:ComputerBuilder* builder;
public:void setBuilder(ComputerBuilder* builder) {this->builder = builder;}Computer* construct(){builder->buildCpu();builder->buildMemory();builder->buildHardDisk();return builder->getComputer();}
};int main()
{Director director;// 創建高配電腦HighEndComputerBuilder highEndBuilder;director.setBuilder(&highEndBuilder);Computer* highEndComputer = director.construct();highEndComputer->showInfo();// 創建低配電腦LowEndComputerBuilder lowEndBuilder;director.setBuilder(&lowEndBuilder);Computer* lowEndComputer = director.construct();lowEndComputer->showInfo();delete highEndComputer;delete lowEndComputer;return 0;
}
在上述代碼中:
Computer類就是產品類,代表要構建的電腦對象,有設置各部件屬性和展示自身信息的方法。
ComputerBuilder是抽象建造者,定義了構建電腦各部件及獲取電腦對象的抽象方法。
HighEndComputerBuilder和LowEndComputerBuilder是具體建造者,分別按照高配和低配的配置來構建電腦對象。
Director類作為指揮者,通過調用建造者的方法來協調完成電腦對象的構建過程,最終客戶端代碼(main函數中)可以方便地通過指揮者和不同的建造者配合,創建出不同配置的電腦對象,整個創建過程條理清晰,易于擴展和維護。
C++示例代碼2
#include<iostream>
#include<list>
#include<string>
using namespace std;class product
{list<string>ls;
public:void add(string m_str){ls.push_back(m_str);}void show(){list<string>::iterator itr = ls.begin();for(;itr!=ls.end();++itr){cout<<*itr<<endl;}}
};
class builder
{
public:virtual void head(){};virtual void body(){};virtual void leg(){};virtual void hand(){};virtual product getresult(){product s;return s;};
};class conbuild1:public builder
{
private:product *m_product;
public:conbuild1(){m_product = new product();}void head(){m_product->add("1的頭");}void body(){m_product->add("1的身體");}void leg(){m_product->add("1的腿");}void hand(){m_product->add("1的手");}product getresult(){return *m_product;}
};class conbuild2:public builder
{
private:product *m_product;
public:conbuild2(){m_product = new product();}void head(){m_product->add("2的頭");}void body(){m_product->add("2的身體");}void leg(){m_product->add("2的腿");}void hand(){m_product->add("2的手");}product getresult(){return *m_product;}
};class director
{
public:void createpeople(builder *s){s->body();s->hand();s->leg();s->head();}
};int main()
{director s;builder *p1 = new conbuild1;builder*p2 = new conbuild2;s.createpeople(p1);product s1 = p1->getresult();s1.show();cout<<"---------------"<<endl;s.createpeople(p2);product s2 = p2->getresult();s2.show();
}