2012-03-09 91 views
1

我目前正在审查设计模式。我遇到了这个Multiton,但我觉得很难想出一个很好的现实世界的使用示例。Multiton - 真实世界的例子?

那么Multiton模式优势的主要应用领域是什么?

+1

它可以用于资源池。 [本文解释了一些用例](http://gen5.info/q/2008/07/25/the-multiton-design-pattern/) – 2012-03-09 08:51:23

回答

2
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 

这是多音,一个实际的例子

1

Multiton是一种设计模式,这将确保只有一个对象将用于密钥在多线程环境中创建。因此,如果多个线程尝试传递相同的密钥,则应该为该密钥获取相同的对象(锁定对象)。可能我们称之为基于关键的单身人士。

如果我们有只有一个锁定整个系统中的对象;那么你的应用程序就是singleTon。但是这里有多个锁定对象;并用键映射每个对象。

一个例子是;假设有多个会议,并且您希望允许会议的呼叫者逐个加入(统计会议中的呼叫者数量)(每个会议对象同步)及其各自的会议ID。如果我有单身对象,那么即使来自不同会议的呼叫者也会被阻止。所以我需要锁定每个会议。

所以会议锁定对象应根据会议ID创建;并且当多个线程试图访问具有相同会议ID(多密钥)的相同会议对象时,应该最终在系统中进行同步。因此,如果两个呼叫者同时拨打同一个会议将会同步。

class LockByKey { 
    ObjectForStringKey objHolder = new ObjectForStringKey(100); 
    public void lockThenWorkForKey (String key) { 
     synchronized(objHolder.valueOf(key)){ 
      //DoSomeWork 
     } 
    } 
} 

//MultiTon 
public final class ObjectForStringKey { 

    private final Object[] cache; 
    private final int cacheSize; 
    final int mask; 

    public ObjectForStringKey(int size) { 
     // Find power-of-two sizes best matching arguments 
     int ssize = 1; 
     while (ssize < size) { 
      ssize <<= 1; 
     } 

     mask = ssize - 1; 
     cache = new Object[ssize]; 
     cacheSize = ssize; 
     //build the Cache 
     for (int i = 0; i < cacheSize; i++) { 
      this.cache[i] = new Object(); 
     } 
    } 

    public Object valueOf(String key) { 
     int index = key.hashCode(); 
     return cache[index & mask]; 
    } 
} 
0

我认为Java的ScriptEngine的例子就是一个很好的例子:

// For nashorn 
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); 

// For rhino 
ScriptEngine engine = new ScriptEngineManager().getEngineByName("rhino"); 

犀牛和犀牛都(通用)ScriptEngine的,只有参数显示这是用来执行。

0

另一个例子:

假设你有一些监控摄像头,每个摄像头可以有一个,只有一个控制器。

在这种情况下,你应该得到相机类multiton。它有一个包含<key, camera>对的哈希映射。如:

public sealed class Camera 
    { 
    static Dictionary<int, Camera> _cameras = new Dictionary<int, Camera>(); 
    static object _lock = new object(); 

    private Camera() 
    { 
     HardwareId = Guid.NewGuid(); 
    } 

    public static Camera GetCamera(int cameraCode) 
    { 
     lock (_lock) 
     { 
      if (!_cameras.ContainsKey(cameraCode)) _cameras.Add(cameraCode, new Camera()); 
     } 
     return _cameras[cameraCode]; 
    } 

    public Guid HardwareId { get; private set; } 
}