2009-05-24 28 views
6

在第175頁,有一個巧克力鍋類的例子。事情是這樣的:Singleton模式 - 懷疑頭部設計模式書

public class ChocolateBoiler { 

    private boolean empty; 
    private boolean boiled; 

    public ChocolateBoiler { 
    empty = true; 
    boiled = false; 
    } 
// and then three methods to fill, drain and boil which changes the 
// status of these two flag depending of situation 
} 

在節「腦力」他們問一個問題:「如果在一個應用程序中創建ChocolateBoiler的多個實例如何可能出問題?」

我不確定這個班有什麼問題。爲什麼我們在這裏引入單例模式?這兩個標誌不是靜態的,所以每個實例一個。那麼如何創建多個實例可以搞砸?

回答

2

問題不在於製作對象的實例。

這是關於對象的兩個實例引起的混淆,它們都聲稱具有ChocolateBoiler的狀態。

如果某個對象(例如,Cooker)認爲它具有ChocolateBoiler的狀態,並且它具有ChocolateBoiler的狀態,那麼現在會發生什麼?

由於變量實例變量,因此ChocolateBoiler對象不會同意ChocolateBoiler的狀態。現在會發生什麼?

2

這只是一個問題,如果只有一個ChocolateBoiler,如果只有一個,它應該是一個單身。

1

我相信在這個例子中,你只有一個巧克力鍋爐。所以你應該只能創建一個代表它的對象的實例。如果你被允許創建多個實例,那麼你可能會在你的系統中的某個地方發出命令if (boiler.hotEnough()) boiler.stop(),並且會感到驚訝的是,儘管鍋爐已經太熱了,但它並沒有停止,因爲你正在談論某個「死亡」鍋爐,返回hotEnough():錯誤。

使用singleton模式,您可以確保無論您在代碼中的哪個位置,您都會說Boiler.getInstance(),您將獲得唯一的鍋爐對象,並且當您與它交談時,它會執行正如你所期望的那樣。

+0

謝謝你們的回覆。看來我對待這個問題的方式太多了:) – alonzo 2009-05-24 11:55:35

1

在閱讀時,整個單身的巧克力鍋的例子讓我感到困擾。

在一個非常基礎的層面上,我不明白爲什麼當你只有一個物理事物時它是必要的,爲了在軟件中強制實現這個事實。如果你得到另一個會發生什麼?你打算怎麼做,把第二個添加到同一個單身人士?做2個不同的單身人士?一個簡單的全局變量可以完成這項工作。

國際海事組織,它不是鍋爐本身,你只能有一件事,它的訪問該鍋爐的控制。你不能允許第二個人開始製作新的一批巧克力,而其他人已經在那個過程中,或者甚至允許同一個人在第一批完成之前進行第二批。從這個角度來看,一個簡單的排隊或批處理系統可以完成這項工作。使用本書中的另一種模式,命令模式將是更好的處理方式,因爲只有一個女服務員,所有新訂單都排隊等待,直到廚師完成當前食品訂單。 (呃,如果你還沒有看過這本書,我剛剛說的話可能沒有什麼意義,對不起)

也許我只是沒有明白這一點。我之前沒有做過多的面向對象設計或任何設計模式,因此我失去了工作機會,所以我正在閱讀它。