2012-03-09 5 views
1

В настоящее время я просматриваю образцы дизайна. Я наткнулся на этот Multiton, но мне трудно думать о хорошем примере использования реальных миров.Multiton - пример реального мира?

Итак, какова основная область применения сильных сторон многоугольника?

+1

Его можно использовать для пулов ресурсов. [В этой статье объясняются некоторые варианты использования] (http://gen5.info/q/2008/07/25/the-multiton-design-pattern/) –

ответ

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

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

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 

это многочастотный, пример реальной жизни

1

Multiton является шаблоном, который обеспечит только один объект будет создан для Key в многопоточных среде. Поэтому, если несколько потоков пытаются передать один и тот же ключ, он должен получить тот же объект (объект блокировки) для этого ключа. Может быть, мы называем это ключевой синглтон.

Если у нас есть ТОЛЬКО ОДИН объект блокировки в общей системе; то для вашего приложения это singleTon. Но здесь несколько объектов блокировки; и каждый объект сопоставляется с ключом.

Один пример; предположим, что существует несколько конференций, и вы хотите, чтобы вызывающие абоненты конференции должны были объединяться один за другим (чтобы подсчитать количество вызывающих абонентов в конференции) (СИНХРОНИЗИРОВАННЫЙ ДЛЯ ОБЪЕКТА КОНФЕРЕНЦИИ) с их соответствующим идентификатором конференции. Если у меня есть одноэлементный объект, тогда даже вызывающие из другой конференции будут заблокированы. Поэтому мне нужна блокировка для каждой конференции.

Таким образом, объекты конференц-связи должны создаваться на основе идентификатора конференции; и когда несколько потоков, пытающихся получить доступ к одному объекту конференции с одним и тем же идентификатором конференции (многотоновый ключ), должны завершиться синхронизацией в системе. Таким образом, если два вызывающих абонента на одной и той же конференции одновременно будут синхронизированы.

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"); 

Nashorn и носорог оба (генерики) ScriptEngine «s только параметр показывает, какой используется реализация.

0

Другой пример:

Предположим, у вас есть несколько камер наблюдения, и каждая камера может иметь один и только один контроллер.

В этом случае вы должны получить мультиталон класса камеры. он имеет хэш-карту, содержащую <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; } 
} 
Смежные вопросы