建立型設計模式之build模式

2021-09-17 00:27:07 字數 3774 閱讀 7752

最近在讀《設計模式-可復用物件導向軟體設計的基礎》一書,在閱讀的過程中我會結合書中的相關知識和例項以及在網路上的部落格對相關的模式的理解進行總結,並在此基礎上加入自己的一些理解,總結模式中需要注意的一些點,記錄在此部落格,以供大家交流分享,同時防止自己對內容遺忘,如有不正確指出,歡迎批評指正。

本節的主要內容是設計模式中的建立型模式之一:builder模式

要用好builder模式,必須對其機制了解透徹,將該模式用在合適的軟體中才能顯出它真正的威力,第五部分中例項將為您展示它的真正威力。

本文內容分為以下幾個方面:

builder模式的精髓都隱藏於builder模式的意圖和實用性中,讓你真正理解這兩個方面,可以說你已經掌握了builder模式(以下意圖和模式都摘自《設計模式》書中)

builder模式的意圖是將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

提前記錄一下:裝配的工作是由導向器(director)完成的,複雜物件的建立是由具體的建造器完成(concretebuilder),這裡不明白沒問題,等你看完全文再過來看這裡你就理解了。

當且僅當上面兩個條件均滿足的情況下我們要使用builder模式(完全理解這兩條不一件重要的事情,但是不要著急,當你讀完這篇文章的時候就會撥開它的廬山真面目了)

builder模式的uml類圖關係如下:

注意的問題:

從上面的類圖中我們也可以看出,在builder模式中的參與者有以下四種,以及他們的職責分別是:(此處為個人理解,與書中內容可能不一致,如果有問題歡迎指正)

先上一張時序圖:

從上面的時序圖可以分析出,各個成分之間的互動方式如下:

兩個例項來自網路對兩本書籍例項的糾正,改編

上面這篇文章深刻的分析了builder模式的本質以及諸多誤區的分析,收益頗多,在此感謝博主分享。

在本例中,裝置(equipment)是乙個複雜物件,由乙個machine和乙個或多個輸入埠(inputport)或者輸出埠(outputport)組成;其中輸入或輸出埠可能有不同的型別(ordinary和super)。現在要你設計乙個生成不同型號的產品,要求產品可能包含一進一出(普通或super),一進兩齣(普通或super)。

在設計中,我們首先定義乙個lcdfactory物件充當director,乙個裝置生成器(eqpbuilder),相當於builder。

​ 首先ordinary和super是port的內部實現方式不同,所以我們需要定義兩個具體類,即 ordinaryeqpbuilder和supereqpbuilder。

​ 在eqpbuilder中,我們將定義四個函式,分別是:buildmachine(), addinputport(), addoutputport()和geteqp()。兩個concrete類繼承eqpbuilder。

​ 當我們需要獲取不同數目的port的裝置,這屬於組裝方面的範疇,所以我們將在lcdfactory中的createeqp中做。其uml類圖如下:

這裡所說的注意的問題可能上面已經提到了,但是這裡還是要著重強調一下,因為我們稍不注意,就可能將模式濫用,導致系統設計的失敗。

這是本人使用kfc服務員生成**時的一種模擬,其實實際情況中並不需要使用builder模式,但是這裡為了練手強行寫成了builder模式,希望大家不要吐槽。

注意此處water相當於director的作用

#ifndef kfcwaiter_hpp_

#define kfcwaiter_hpp_

#include "mealbuilder.hpp"

class kfcwaiter ;

#endif

#include "kfcwaiter.hpp"

void kfcwaiter::setmealbuilder(std::shared_ptrt_builder)

void kfcwaiter::construct()

// meal.hpp meal相當於product

#ifndef meal_hpp

#define meal_hpp

#include #include class meal ;

#endif

#include "meal.hpp"

meal::meal(std::string t_food, std::string t_drink)

: m_food(t_food), m_drink(t_drink) {}

meal::~meal() {}

std::string meal::getfood() const

std::string meal::getdrink() const

void meal::getmeal() const

void meal::buildfood(const std::string &t_food)

void meal::builddrink(const std::string &t_drink)

#ifndef builder_hpp

#define builder_hpp

#include "meal.hpp"

#include #include class mealbuilder ;

protected:

std::shared_ptrm_meal;

};#endif

#include "mealbuilder.hpp"

mealbuilder::mealbuilder() : m_meal(std::shared_ptr(new meal())) {}

std::shared_ptrmealbuilder::getresult()

#ifndef mealbuildera_hpp_

#define mealbuildera_hpp_

#include "mealbuilder.hpp"

class mealbuildera : public mealbuilder ;

#endif

#include "mealbuildera.hpp"

void mealbuildera::buildfood()

void mealbuildera::builddrink()

#ifndef mealbuilderb_hpp_

#define mealbuilderb_hpp_

#include "mealbuilder.hpp"

class mealbuilderb : public mealbuilder ;

#endif

#include "mealbuilderb.hpp"

void mealbuilderb::buildfood()

void mealbuilderb::builddrink()

#include "kfcwaiter.hpp"

#include "mealbuildera.hpp"

#include "mealbuilderb.hpp"

int main()

設計模式之Build模式

模式定義 將乙個複雜物件的構建與他的表示分離,即允許使用者不知道內部構建細節的情況下,可以精確的控制物件的構建流程。模式結構 略 模式實現 public class buildmodel 抽象產品類 也可以不抽象 abstract class phone public void setprice s...

建立型設計模式之

單例模式保證了乙個類的例項的全域性唯一性。餓漢模式的單例模式 public class singleton 構造方法私有 private static singleton singleton new singleton 在類內部建立例項物件 public static singleton getsi...

設計模式之工廠模式(建立型)

什麼是設計模式?每乙個模式描述了我們周圍不斷重 生的問題,以及該問題的解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重複勞動。1.簡單工廠 factory 當看到 new 時,就會想到 具體 pizza pizza new cheesepizza 當有很多種pizza時,我們需要用選擇語...