2012-02-18 24 views
5

在大多數教程中(Judith Bishops的書或here),我看到類似於下面的示例。爲什麼要使用構建器模式?

如果構造器模式是指創建方法,主任級,執行集合構建的孩子的作業的建設...

class Director { 
    public static void Construct(Builder builder) { 
    builder.BuildPartA(); 
    builder.BuildPartB(); 
    ... 
    } 
} 

abstract class Builder { 
    public abstract void BuildPartA(); 
    public abstract void BuildPartB(); 
    ... 
} 

class Builder1 : Builder { ... } 
class Builder2 : Builder { ... } 

void Main() { 
    Builder1 b1 = new Builder1(); 
    Builder2 b2 = new Builder2(); 
    Director.Construct(b1); 
    Director.Construct(b2); 
} 

......爲什麼我們不只是移動的構建方法來構建器類?

class Builder { 
    public virtual void BuildPartA(); 
    public virtual void BuildPartB(); 
    public void Construct() { 
    BuildPartA(); 
    BuildPartB(); 
    ... 
    } 
    ... 
} 

class Builder1 : Builder { ... } 
class Builder2 : Builder { ... } 

void Main() { 
    Builder1 b1 = new Builder1(); 
    Builder2 b2 = new Builder2(); 
    b1.Construct(); 
    b2.Construct(); 
} 

請給我看一些建造者模式真正有用的例子。

+0

我不知道如果我用這個模式,到目前爲止,但它看起來像的想法是允許製造商從它的定義來實現獨立的,因此允許存在任何數量的完全獨立於正在使用它們的導演類別的不同構建者。 – rid 2012-02-18 22:27:22

+0

@Radu:但Director類並不獨立於Builder:它在Construct的參數中使用Builder類。 – 2012-02-18 22:31:26

+0

確實,它使用了構建器,但它並不需要知道構建器是如何實現的。它只知道公共接口。同樣,構建器不需要知道使用它的類的詳細信息。 – rid 2012-02-18 22:33:25

回答

5

目錄應該知道組裝不同的組件來構建對象的正確順序。我相信這只是簡單地將知道構造這些對象的順序或方法從基類Builder類(它僅僅是一個基類)中分離出來。如果將構造移到Builder基礎中,它將類似於模板方法模式。

最好是有一個知道如何組裝的組件不同的導演因爲即使是在構建的組件進行修改的「祕方」,基類並不需要改變。例如,假設某一類組件需要通過執行一定的順序3個步驟來建立的:

  1. 步驟A
  2. 步驟B
  3. 步驟C

讓我們在說一些點另一個組件被添加到可以按照相同步驟但以不同順序構建的家族中:

  1. 步驟A
  2. 步驟C
  3. 步驟B

在這種情況下,如果用於序列中的邏輯在處長被分離,而不是基礎類生成器,可以繼承新的導演並用它來構造。如果邏輯位於基本構建器中,那麼基類可能是獨立庫或JAR的一部分,或者是C++的頭文件,它可能需要重新編譯具體類或至少運送新的JAR。

我敢肯定有分離如此受關注的更多的優勢。

+0

但是爲什麼要分離Builder邏輯?導演無法訪問私人Builder成員,導致代碼更難以理解......對不起,如果我沒有得到它:請提供一些澄清的例子嗎? – 2012-02-18 22:38:10

+0

@JanTuroň查看我對 – Sid 2012-02-18 22:49:14

+0

+1的更新,因爲有時需要額外的重新編譯。但是,對於我來說,構建模式的額外複雜性對我來說太昂貴了。 – 2012-02-18 23:01:01

1
+0

因此,如果這些構建器是可重用對象,並且我們希望它們只在一個地方執行特定的一組操作,那麼它將使用僅使用一次的方法來混淆它們的代碼,因此將這些操作分離爲自定義類以及是導演的目的。這對Builder模式來說是非常好的理由。我明白了嗎? – 2012-02-20 11:06:55

+0

好吧,想象一下視頻中的例子......假設我們正在製作一張地圖,但由於玩家沒有更多挖掘工具,遊戲不會在地圖上輸出「資源」,因爲用戶無法訪問它們。爲什麼要在每個構建器中添加資源到地圖的邏輯,當邏輯可以駐留在導演中時,他告訴當前構建者是否輸出資源。 – arieljake 2012-02-21 07:14:41

+1

@arieljake:鏈接不工作。我瞭解它太舊,但僅供參考。 – user2463514 2014-01-24 13:09:37

相關問題