程式扎記: [OO 設計模式] Singleton Patterns : 確保同一時間只有一個實例或物件進行服務

標籤

2010年7月29日 星期四

[OO 設計模式] Singleton Patterns : 確保同一時間只有一個實例或物件進行服務


前言 :
在某些時候, 為了管控資源或是避免多個物件分享相同資源造成的 Race condition, 我們希望在同一時間, 某個類別只會存在一個唯一的物件, 這時你便可以利用這個設計模式.

範例一 :
代碼說明 : 透過下面代碼, 我們透過統一的API 來獲得類別 Singleton 的物件, 只要該類別被建立過在接下來的 null 判斷就不在產生新的物件.
  1. public class Singleton{  
  2.     private static Singleton uniqueInstance;  
  3.     private Singleton(){} // 使用Private 建構子, 確保類別Singleton 的物件化只能透過 API:getInstance()  
  4.     public static Singleton getInstance() {  
  5.         if(uniqueInstance == null ) {uniqueInstance = new Singleton();}  
  6.         return uniqueInstance;  
  7.     }  
  8. }  
問題點 :
乍看好像可以滿足Singleton 的要求, 但如果是在多線程環境下呢? 可能某支Thread 正在產生物件同時, 另一支Thread 在 if(uniqueInstance==null) 判斷時也進入迴圈, 造成同一時間產生了一個以上的物件, 為了解決這個問題可以使用 synchronized 關鍵字 :
  1. public class Singleton{  
  2.     private static Singleton uniqueInstance;  
  3.     private Singleton(){} // 使用Private 建構子, 確保類別Singleton 的物件化只能透過 API:getInstance()  
  4.     public static synchronized Singleton getInstance() { // 使用 synchronized 關鍵字避免同時兩支Thread 進入函數  
  5.         if(uniqueInstance == null ) {uniqueInstance = new Singleton();}  
  6.         return uniqueInstance;  
  7.     }  
  8. }  


補充說明 :
Wiki : Singleton pattern
In software engineering, the singleton pattern is a design pattern used to implement the mathematical concept of a singleton, by restricting the instantiation of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system. The concept is sometimes generalized to systems that operate more efficiently when only one object exists, or that restrict the instantiation to a certain number of objects (say, five). Some consider it an anti-pattern, judging that it is overused, introduces unnecessary limitations in situations where a sole instance of a class is not actually required, and introduces global state into an application...

史蒂芬新的筆記 : Singleton
當系統中某項資源只有一個,而且絕對獨一無二時,最適合使用這個Pattern,也就是說使用這個Pattern可以確保 物件個體只有一個,不會因programmer的疏忽而產生兩個或兩個以上...
This message was edited 3 times. Last update was at 18/05/2010 15:41:58

1 則留言:

  1. 請問有人在找Android 的工作嗎? 我們擴編需要找人

    Jordan_chung@hotmail.com

    回覆刪除

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!