l

2013年8月15日 星期四

重新整理Singleton Pattern

August 13 22:50~24:00;17:40~19:16

螢幕快照 2013-08-14 下午7.25.11

 

今天介紹GoF的23個設計模式中可能是最具爭議的一個模式:Singleton。雖然Singleton的目的之一是為了避免使用全域變數,但實際上Singleton其實也就是一種全域變數。用了Singleton之後會導致系統與Singleton產生隱含的耦合關係,除了可能會使得系統變得不易理解,也會增加測試的難度,所以有一派人馬認為應該要完全避免使用Singleton。

但也有人認為正確的使用Singleton是可以被接受的,重點是要如何判斷什麼是「正確」的使用情境。對於Singleton正、反面的討論,可參考《Why Singletons are Evil》、《Use your singletons wisely》、《Singletons search results on C2》這些網路上的文章,以及《Refactoring to Patterns》與《Working Effectively with Legacy Code》這兩本書。

接下來看整理後的結果。

***

Name:Singleton

Context:主流的物件導向程式語言允許我們自由地從一個類別產生多個實例,但卻沒有直接支援可以控制一個類別產生實例個數的機制。

Problem:如何產生一個物件?

Force:

  • 你設計的類別代表了在真實世界中的特定情境之下,只會存在一份實例且具有狀態的「實體」、「服務」或「概念」,例如硬體的輸入/輸出埠、GPS、時鐘、印表機多工緩衝處理程式、檔案系統;而非在某種情境下,某個類別恰巧只需要產生一個實例。
  • 這個單一實例要很容易地被其他物件存取。

Solution:在類別中宣告一個型別為類別本身的靜態成員變數(static data member)作為回傳客戶端的單一實例。把類別的建構元改成非公開以防客戶端直接產生此類別的實例。最後在類別中定義一個靜態的getInstance()方法,傳回這個單一實例靜態成員變數。

螢幕快照 2013-08-14 下午6.30.48

***

今天早上起床有點感冒的症狀,希望不要太嚴重以至於影響到寫作,部落格沒有庫存啊挑眉質疑

***

友藏內心獨白:7/23,完成率30.43%。

1 則留言:

  1. Java 實作中,Lazy Initialization Holder可以避免多執行緒環境Singleton初始化時效能的問題。
    http://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom

    回覆刪除