1. 程式人生 > >複雜物件的建立--建造者模式(Builder)

複雜物件的建立--建造者模式(Builder)

1初識建造者模式

建造者模式實際上是常用的設計模式。顧名思義,builder的意思是建造者或者建築工人,談到建造自然會想到樓房。樓房是千差萬別的,樓房的外形、層數、內部房間的數量、房間的裝飾等等都不一樣,但是對於建造者來說,抽象出來的建築流程是確定的,往往建築一座樓房包括下面的步驟:(1)打樁,建立基礎(2)建立框架等。建造者模式的本質和建造樓房是一致的:即流程不變,但每個流程實現的具體細節則是經常變化的。建造者模式的好處就是保證了流程不會變化,流程即不會增加、也不會遺漏或者產生流程次序錯誤,這是非常重要的。我們熟知的樓歪歪事件,官方的解釋就是由於先建立樓房後,再建設停車場造成的,這是典型的建造次序錯亂。(看來這些人兒不知道建造者模式啊!!!)

我生活的地方有一個菜叫“鍋包肉”。基本每個餐館都有,但是每個餐館的味道都不一樣,原因是什麼呢?因為這道菜的作法沒有形成標準唄!每個人的作法都不一樣,所以味道就不一樣了。這實際上通過“建造者模式”讓每個館子的“鍋包肉”都一樣。同樣的KFC做出來的東西,不論是全國哪家店做出來就都一個味,因為KFC內部有很嚴格的規定,做巨無霸有做巨無霸的流程,必須嚴格遵守,這樣做出來的東西當然一致了。KFC就是採用了建造者模式!!

說了這麼多,到底什麼是建造者模式呢?這麼神奇。看看GoF怎麼說。

建造者模式:是將一個複雜的物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。

建造者模式通常包括下面幾個角色:

  1. builder:給出一個抽象介面,以規範產品物件的各個組成成分的建造。這個介面規定要實現複雜物件的哪些部分的建立,並不涉及具體的物件部件的建立。

  2. ConcreteBuilder:實現Builder介面,針對不同的商業邏輯,具體化複雜物件的各部分的建立。 在建造過程完成後,提供產品的例項。

  3. Director:呼叫具體建造者來建立複雜物件的各個部分,在指導者中不涉及具體產品的資訊,只負責保證物件各部分完整建立或按某種順序建立。

  4. Product:要建立的複雜物件。

按照慣例,還是給出建造者模式的結構圖

這裡寫圖片描述

2 一個建造者模式例子實現

不妨就實現《大話設計模式》上的建造小人的例子吧!!在遊戲開發中建造小人是經常的事了,要求是:小人必須包括,頭,身體,手和腳。現在系統要包括的分為胖人和瘦人。寫出建造者模式的程式碼如下:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

//Product類
//這個類不是那麼重要,它只是一個產品類,一個產品由很多部件組成,
//Builder介面是精華,它規定了生產這樣一個產品的流程
//Builder介面的實現類則是細節,是多型,從一個流程下建立同類但不同型號的產品

//多型可以簡單理解為用基類呼叫不同的具體實現,所以我們往往會用一個方法,或是一個類,來封裝在不同條件下呼叫不同實現的程式碼,本文提到的Director就是起到這個普遍作用,沒有什麼特殊的,不要被這一個個的定義弄糊塗了。
class Product
{
    vector<string> parts;
public:
    void Add(const string part)
    {
        parts.push_back(part);
    }
    void Show()const
    {
        for(int i = 0 ; i < parts.size() ; i++)
        {
            cout<<parts[i]<<endl;
        }
    }
};

//抽象builder類
class Builder
{
public:
    virtual void BuildHead() = 0;
    virtual void BuildBody() = 0;
    virtual void BuildHand() = 0;
    virtual void BuildFeet() = 0;
    virtual Product GetResult() = 0; 
};

//具體胖人建立類
class FatPersonBuilder :public Builder
{
private:
    Product product;
public:
    virtual void BuildHead()
    {
        product.Add("胖人頭");//建立瘦人的頭
    }
    virtual void BuildBody()
    {
        product.Add("胖人身體");//建立瘦人的身體
    }
    virtual void BuildHand()
    {
        product.Add("胖人手");//建立瘦人的手
    }
    virtual void BuildFeet()
    {
        product.Add("胖人腳");//建立瘦人的腳
    }
    virtual Product GetResult()
    {
        return product;
    }
};

//具體瘦人人建立類
class ThinPersonBuilder :public Builder
{
private:
    Product product;
public:
    virtual void BuildHead()
    {
        product.Add("瘦人人頭");//建立瘦人的頭
    }
    virtual void BuildBody()
    {
        product.Add("瘦人身體");//建立瘦人的身體
    }
    virtual void BuildHand()
    {
        product.Add("瘦人手");//建立瘦人的手
    }
    virtual void BuildFeet()
    {
        product.Add("瘦人腳");//建立瘦人的腳
    }
    virtual Product GetResult()
    {
        return product;
    }
};

//Director類
class Director
{
public:
    void Construct(Builder &builder)
    {
        builder.BuildHead();
        builder.BuildBody();
        builder.BuildHand();
        builder.BuildFeet();
    }
};

int main()
{
    Director *director = new Director();
    Builder *b1 = new FatPersonBuilder();
    Builder *b2 = new ThinPersonBuilder();

    director->Construct(*b1);
    Product p1 = b1->GetResult();
    p1.Show(); 
    return 0;
}

看過上面程式碼發現使用建造者模式有什麼好處了嗎?上面的例子,通過建造者模式,使得建造過程通過Director類的Construct函式固定了,即建造過程不會變,也就是滿足上面要求中紅色字型的“必須包括”。但是具體的頭,身體,手腳這些身體的各個部分會變化,基類Builder中將各種Build函式定義為抽象方法,必須在子類中實現。這樣不僅僅使得建造小人的過程不變,而且很利於系統的擴充套件,一旦出現其他種類的人根本不需要改動之前的FatPersonBuider,ThinPersonBuilder,Director,Product等類,只需要新新增新的類。符合OCP原則。

到這裡不知道大家有沒有這樣的疑問,建造者模式和工廠方法模式非常相似啊,確實是非常的相似,建造者模式注重零部件的組裝過程,而工廠方法模式更注重零部件的建立過程。

工廠方法模式:
【一個工廠可以建立多種不同的產品,所以定義產品的介面,利用產品的多型。】把一個類的例項化延遲到它的子類中,核心的工廠類不負責所有產品的建立,而是將具體建立的工作交給子類去做。讓子類決定例項化哪一個類。即抽象工廠角色。

抽象工廠模式:
【在工廠方法模式的基礎上,解決工廠過多的問題,所以也提供工廠的介面】向客戶端提供一個介面,使得客戶端在不必指定產品的具體型別的情況下,建立多個產品族中的產品物件。既提供一個建立一系列相關或相互以來物件的介面,而無需指定它們的具體的類,這就是抽象工廠模式的用意。是工廠方法模式的進一步推廣。

建造者模式:
【如果上面兩種模式用生成零件來比喻的話,那麼Builder關注的更多的是組裝。所以很多情況是抽象工廠+建造者模式】將一個產品的內部表象和產品的生成過程分開來,從而可以使一個建造過程生成具有不同的內部表象的產品物件。

相關推薦

複雜物件建立--建造模式Builder

1初識建造者模式 建造者模式實際上是常用的設計模式。顧名思義,builder的意思是建造者或者建築工人,談到建造自然會想到樓房。樓房是千差萬別的,樓房的外形、層數、內部房間的數量、房間的裝飾等等都不一樣,但是對於建造者來說,抽象出來的建築流程是確定的,往往建築

建造模式-Builder Pattern 複雜物件的組裝與建立——建造模式:關於Director的進一步討論,建造模式總結

8.4 關於Director的進一步討論 指揮者類Director在建造者模式中扮演非常重要的作用,簡單的Director類用於指導具體建造者如何構建產品,它按一定次序呼叫Builder的build

建造模式-Builder Pattern 複雜物件的組裝與建立——建造模式:遊戲角色設計的建造模式解決方案

8.3 完整解決方案       Sunny公司開發人員決定使用建造者模式來實現遊戲角色的建立,其基本結構如圖8-3所示: 圖8-3 遊戲角色建立結構圖       在圖8-3中,Ac

複雜物件的組裝與建立——建造模式

8.4 關於Director的進一步討論 指揮者類Director在建造者模式中扮演非常重要的作用,簡單的Director類用於指導具體建造者如何構建產品,它按一定次序呼叫Builder的build

複雜物件的組裝與建立——建造模式

      沒有人買車會只買一個輪胎或者方向盤,大家買的都是一輛包含輪胎、方向盤和發動機等多個部件的完整汽車。如何將這些部件組裝成一輛完整的汽車並返回給使用者,這是建造者模式需要解決的問題。建造者模式又稱為生成器模式,它是一種較為複雜、使用頻率也相對較低的建立型模式。建造

複雜物件的組裝與建立——建造模式

8.3 完整解決方案       Sunny公司開發人員決定使用建造者模式來實現遊戲角色的建立,其基本結構如圖8-3所示: 圖8-3 遊戲角色建立結構圖       在圖8-3中,ActorCont

複雜物件的組裝與建立——建造模式:遊戲角色設計,模式概述

沒有人買車會只買一個輪胎或者方向盤,大家買的都是一輛包含輪胎、方向盤和發動機等多個部件的完整汽車。如何將這些部件組裝成一輛完整的汽車並返回給使用者,這是建造者模式需要解決的問題。建造者模式又稱為生成器模式,它是一種較為複雜、使用頻率也相對較低的建立型模式。建造者

設計模式建造模式Builder

人的 做出 字體 存在 分享 定義 固定 也不會 抽象方法 一個人活到70歲以上,都會經歷這樣的幾個階段:嬰兒,少年,青年,中年,老年。並且每個人在各個階段肯定是不一樣的呀,我覺得可以說世界上不存在兩個人在人生的這5個階段的生活完全一樣,但是活到70歲以上的人,都經歷了這幾

【Unity3D與23種設計模式建造模式Builder

產出 private 一個 gof 行為 並且 bstr reac 定義 GoF中定義: “將一個復雜的構建流程與它的對象表現分離出來,讓相同的構建流程可以產生不同的對象行為表現。” 建造者模式可以分為兩個步驟來實施: 1.將復雜的構建流程獨立出來,並將整個流程分成

GOF23設計模式建造模式builder

gin 實例 情況 gof ace state 實現 oid sql 一、建造者模式概述   建造者模式的本質:     1.分離了對象子組件的單獨構造(由Builder負責)和裝配(由Director負責)。從而可以構造出復雜的對象。這個模式適用於:某個對象的過程復雜的情

設計模式總結篇系列:建造模式Builder

關於建造者模式網上有很多文章,也有些不同的理解。在此結合網上其他文章對建造者模式進行總結。 總體說來,建造者模式適合於一個具有較多的零件(屬性)的產品(物件)的建立過程。根據產品建立過程中零件的構造是否具有一致的先後順序,可以將其分為如下兩種形式。 一、通過Client、Director、Builder和

設計模式 ---建造模式Builder

建造者模式:將一個複雜物件的構建過程和表示過程分離。使得同樣的構建過程可以建立不同的表示。 它主要是用於一些複雜的物件,這些物件的內部構建間的構造順序通常是穩定的,但物件內部的構建同時面臨著複雜的變化。建造者模式提供了一個通用的介面,介面中定義了產品建立的過程

設計模式建造模式Builder

 建造者模式:是將一個複雜的物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。  建造者模式通常包括下幾個角色: 1. builder(抽象建造者):給出一個抽象結論,以規範產品物

建造模式Builder C++實現

#include <iostream> #include <string> using namespace std; class Product { private : int id; // 假設為複雜物件 string name; // 假設為複雜物件 publi

建造模式Builder

一、基本定義: 1、意圖: 將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。 2、適用場景: * 多個組成部分,都可以裝配到同一個物件,但是產生的結果不相同 * 相同

對Java建造模式Builder的一點理解

一,Builder模式介紹    Builder模式是一步一步建立一個複雜物件的建立型模式,它允許使用者在不知道內部建造細節的情況下,可以更精細的控制物件的構造流程。該模式是為了將構建複雜物件的過程和它的部件解耦,是的構建過程和不見得表示隔離開來。    因為一個複雜的物件有

iOS 設計模式建造模式 Builder

建造者模式是當在建立複雜物件的演算法應該獨立於該物件的組成部分以及它們的裝配方式時適用的模式。 建造者模式包含產品類(Product)、抽象建造者類(Builder)、具體建造者類(ConcreteBuilder1、ConcreteBuilder2…)和指揮者

PHP設計模式建造模式Builder瞭解下

這個建造者模式,我們也可以稱為生成器模式,核心思想是將一個複雜物件的構造與它的表示分離,使同樣的構建過程可以建立不同的表示,這樣的設計模式被稱為建造者模式,簡單點來說就是為了消除其它物件複雜的建立過程。 例如:汽車,他的發動機引擎有好多品牌,輪胎也有各種材質,內飾更是千奇百

java設計模式——建造模式Builder

相對於抽象工廠模式有了一定優勢,抽象工廠模式只能建立儲存單一類的例項,而建造者模式能儲存多個類的例項了。上程式碼,pass:前幾篇都用First、Second啥的,沒法混了,現在換成人了(*^__^*

建造模式Builder Pattern

pub 圖片 imp 客戶端 問題 復雜 override 適合 type 定義: 將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示 解決的問題: 方便用戶創建復雜的對象(不需要知道實現過程) 代碼復用性 & 封裝性(將對象構建