程式扎記: [OO 設計模式] Gossip@DesignPattern : Registry of Singleton 模式

標籤

2011年2月14日 星期一

[OO 設計模式] Gossip@DesignPattern : Registry of Singleton 模式

轉載自 這裡 
如果你需要管理一群不同類型的物件,並希望在程式中這些物件在取得時都是單例,你可以使用Register of Singleton模式。在Java中若要實現Register of Singleton模式,可以使用Reflection機制 來達成. 底下是範例代碼 : 

- SingletonRegistry.java : 使用 Reflection 建立Singleton物件
  1. import java.util.*;  
  2.   
  3. public class SingletonRegistry {  
  4.     private static Map registry =   
  5.                       new HashMap();  
  6.   
  7.     private SingletonRegistry() {}  
  8.       
  9.     public static Object getInstance(String classname) {  
  10.         Object singleton = registry.get(classname);  
  11.   
  12.         if(singleton != null) {  
  13.             return singleton;  
  14.         }  
  15.         try {  
  16.             singleton = Class.forName(classname).newInstance();  
  17.         }  
  18.         catch(Exception e) {  
  19.             throw new RuntimeException(e);  
  20.         }  
  21.         
  22.         registry.put(classname, singleton);  
  23.         
  24.         return singleton;  
  25.     }  
  26. }  

程式撰寫需透過 SingletonRegistry 的getInstance()來取得所需之物件,SingletonRegistry維持唯一的一個註冊表,註冊表使用Map實現,若註冊表中已有所需之物件就直接傳回,從而保證透過SingletonRegistry的getInstance()所取得的都是單例. 如果不使用Reflection或Introspection機制的話,則可以提供一個註冊方法, 範例代碼如下 : 
- SingletonRegistry.java : 使用方法註冊 Singleton 物件
  1. public class SingletonRegistry {  
  2.     private static Map registry =   
  3.                       new HashMap();  
  4.     private static Singleton instance;  
  5.   
  6.     private SingletonRegistry() {}  
  7.       
  8.     public static void register(String name, Object singleton) {  
  9.         registry.put(name, singleton);  
  10.     }  
  11.   
  12.     public static Object getInstance(String classname) {  
  13.         return registry.get(classname);  
  14.     }  
  15. }  

註冊的時機可以是在建構物件之時,例如 : 
  1. public class Some {  
  2.     public Some() {  
  3.         //...  
  4.         SingletonRegistry.register(Some.class.getName(), this);  
  5.     }  
  6. }  
或者是在建構物件之後主動註冊 : 
  1. Some some = new Some();  
  2. SingletonRegistry.register(Some.class.getName(), some);  
這種方式的缺點是您必須在程式中有一段初始化程序,先向RegistrySingleton進行註冊, 好處是可以適用於沒有Reflection機制的語言. 

沒有留言:

張貼留言

網誌存檔

關於我自己

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