引言
在軟件開發中,構建復雜對象時常常會遇到構造函數或setter方法過于復雜的情況。Builder模式作為一種創建型設計模式,能夠有效地解決這一問題。Guoyao 創建的勇勇(YongYong)角色,通過Builder模式實現了對復雜對象的構建過程與表示的分離,展示了Builder模式在實際項目中的應用。本文將詳細介紹Builder模式在C++中的實現,以及其如何滿足各種面向對象設計原則。
1. Builder模式簡介
Builder模式的核心思想是將復雜對象的構建過程與其表示分離,使得同樣的構建過程可以生成不同的表示。這種分離不僅提高了代碼的靈活性和可維護性,還支持不同的構建策略。
Builder模式主要包括以下幾個角色:
- Product(產品) :要構建的復雜對象。
- Builder(構建者) :定義構建Product各個部分的接口。
- ConcreteBuilder(具體構建者) :實現Builder接口,構建和組裝Product的各個部分。
- Director(指揮者) :負責管理構建過程,協調各個構建步驟。
2. 勇勇(YongYong)角色的需求分析
勇勇(YongYong)角色需要具備以下屬性:
- 飯碗(BowlOfRice) :表示勇勇的基本生存需求。
- 權力(Power) :表示勇勇擁有的權力和影響力。
- 客戶(Customer) :表示勇勇服務的對象。
- 小兵(Soldier) :表示勇勇領導的下屬。
通過Builder模式,我們可以分步構建勇勇(YongYong)對象,確保每個部分的構建邏輯清晰且易于擴展。
3. C++代碼實現
3.1 定義各個部分的類
首先,定義勇勇需要的各個部分的類。每個類都提供一個抽象接口,具體實現由子類完成。
// 飯碗類
class BowlOfRice {
public:virtual ~BowlOfRice() = default;virtual void eat() = 0;
};// 權力類
class Power {
public:virtual ~Power() = default;virtual void exercise() = 0;
};// 客戶類
class Customer {
public:virtual ~Customer() = default;virtual void request() = 0;
};// 小兵類
class Soldier {
public:virtual ~Soldier() = default;virtual void obey() = 0;
};
3.2 定義勇勇(YongYong)類
勇勇類包含上述各個部分的指針,并提供一個work()
方法來協調各個部分的工作。
class YongYong {
private:BowlOfRice* bowlOfRice;Power* power;Customer* customer;Soldier* soldier;public:YongYong(BowlOfRice* bowl, Power* pow, Customer* cust, Soldier* sold): bowlOfRice(bowl), power(pow), customer(cust), soldier(sold) {}~YongYong() {delete bowlOfRice;delete power;delete customer;delete soldier;}void work() {bowlOfRice->eat();power->exercise();customer->request();soldier->obey();}
};
3.3 定義Builder接口
Builder接口定義了構建勇勇對象各個部分的方法。
class GuoyaoBuilder {
public:virtual ~GuoyaoBuilder() = default;virtual void buildBowlOfRice() = 0;virtual void buildPower() = 0;virtual void buildCustomer() = 0;virtual void buildSoldier() = 0;virtual YongYong* getResult() = 0;
};
3.4 實現具體構建者
具體構建者(Guoyao)實現了Builder接口,構建勇勇對象的各個部分。
class Guoyao : public GuoyaoBuilder {
private:YongYong* yongYong;public:Guoyao() {yongYong = new YongYong(nullptr, nullptr, nullptr, nullptr);}~Guoyao() {delete yongYong;}void buildBowlOfRice() override {yongYong->bowlOfRice = new BowlOfRice() {void eat() override {// 具體實現}};}void buildPower() override {yongYong->power = new Power() {void exercise() override {// 具體實現}};}void buildCustomer() override {yongYong->customer = new Customer() {void request() override {// 具體實現}};}void buildSoldier() override {yongYong->soldier = new Soldier() {void obey() override {// 具體實現}};}YongYong* getResult() override {return yongYong;}
};
3.5 定義指揮者
指揮者(Director)負責管理構建過程,協調各個構建步驟。
class Director {
private:GuoyaoBuilder* guoyao;public:Director(GuoyaoBuilder* g) : guoyao(g) {}~Director() {delete guoyao;}YongYong* construct() {guoyao->buildBowlOfRice();guoyao->buildPower();guoyao->buildCustomer();guoyao->buildSoldier();return guoyao->getResult();}
};
3.6 客戶端代碼
客戶端代碼通過指揮者和構建者來構建勇勇對象,并使用它。
int main() {// 創建具體構建者GuoyaoBuilder* guoyao = new Guoyao();// 創建指揮者Director* director = new Director(guoyao);// 構建勇勇對象YongYong* yongYong = director->construct();// 使用勇勇對象yongYong->work();// 釋放內存delete yongYong;delete director;return 0;
}
4. 面向對象設計原則的滿足情況
Builder模式在實現過程中滿足了多種面向對象設計原則,這些原則有助于提高代碼的靈活性、可擴展性和可維護性。
4.1 單一職責原則(SRP)
- 描述:一個類應該只有一個改變的原因。
- 應用:每個類(如
BowlOfRice
、Power
、YongYong
、Director
)只負責一個職責,確保職責明確。
4.2 開閉原則(OCP)
- 描述:軟件實體應該是開放的擴展,但關閉的修改。
- 應用:通過定義抽象的
GuoyaoBuilder
接口,允許通過實現新的Builder
類來擴展構建過程,而無需修改現有的Director
或YongYong
類。
4.3 里氏替換原則(LSP)
- 描述:子類應該能夠替換它們的父類而不導致錯誤。
- 應用:
Guoyao
實現了GuoyaoBuilder
接口,可以替換其父類而不影響Director
類的功能。
4.4 依賴倒置原則(DIP)
- 描述:依賴于抽象而不是具體實現。
- 應用:
Director
類依賴于抽象的GuoyaoBuilder
接口,而不是具體的實現,符合DIP。
4.5 接口隔離原則(ISP)
- 描述:客戶端不應該依賴它不需要的接口。
- 應用:
GuoyaoBuilder
接口只定義了構建對象所需的最小方法集合,客戶端(如Director
類)只需要知道這些方法。
4.6 合成復用原則(CRP)
- 描述:優先使用組合而不是繼承來實現復用。
- 應用:通過組合不同的構建步驟來構建復雜對象,而不是通過繼承來復用代碼。
4.7 迪米特法則(Law of Demeter)
- 描述:一個類應該只與它直接相關的類交互。
- 應用:
Director
類只與GuoyaoBuilder
接口交互,而不直接與具體的構建部分(如BowlOfRice
、Power
等)交互。
5. 表格總結:Builder模式在C++中的實現步驟和代碼結構
步驟 | 描述 | 代碼實現 |
---|---|---|
1. 定義部分類 | 定義“勇勇”需要的各個部分的類。 | cpp BowlOfRice, Power, Customer, Soldier |
2. 定義“勇勇”類 | 包含各個部分的指針,并提供構建方法。 | cpp class YongYong |
3. 定義Builder接口 | 定義構建各個部分的方法。 | cpp class GuoyaoBuilder |
4. 實現具體構建者 | 實現Builder接口,構建各個部分。 | cpp class Guoyao |
5. 定義指揮者 | 管理構建過程,協調各個構建步驟。 | cpp class Director |
6. 客戶端代碼 | 使用Builder模式構建“勇勇”對象。 | cpp main() |
6. 腦圖展示
以下是用腦圖展示的各個類之間的關系和交互:
graph TDA[Director] --> B[GuoyaoBuilder]B --> C[buildBowlOfRice()]B --> D[buildPower()]B --> E[buildCustomer()]B --> F[buildSoldier()]B --> G[YongYong]G --> H[BowlOfRice]G --> I[Power]G --> J[Customer]G --> K[Soldier]H --> L[eat()]I --> M[exercise()]J --> N[request()]K --> O[obey()]
7. 總結
通過Guoyao創建的勇勇(YongYong)角色,我們展示了Builder模式在C++中的實現。Builder模式通過分離對象的構建過程和表示,提供了一種靈活且可維護的方式來構建復雜對象。通過引入Builder、ConcreteBuilder和Director角色,能夠有效管理構建邏輯,提高代碼的可擴展性和復用性。
本文不僅詳細介紹了Builder模式的實現步驟,還分析了其如何滿足各種面向對象設計原則。希望讀者通過本文能夠更好地理解Builder模式在實際項目中的應用,以及如何通過遵循設計原則來提高代碼質量。
8. 參考資料
- 《設計模式:可復用面向對象軟件的基礎》(Gang of Four)
- C++編程規范和最佳實踐 修改一下這篇文章的題目