Мультитон - пример реального мира? - PullRequest
1 голос
/ 09 марта 2012

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

Так, какова основная область применения сильных сторон модели Multiton?

Ответы [ 4 ]

4 голосов
/ 09 мая 2012
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

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

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

это мультитон, пример из реальной жизни

1 голос
/ 17 марта 2015

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

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

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

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

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 голосов
/ 13 января 2017

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

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

В этом случае вы должны получить камеру класса 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; }
}
0 голосов
/ 21 января 2016

Я думаю, что пример Java ScriptEngine является хорошим примером:

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

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

Nashorn и Rhino оба (общие) ScriptEngine, только параметр показывает, какая реализация используется.

...