Multiton - 现实世界的例子?

时间:2012-03-09 08:39:41

标签: java design-patterns multiton

我目前正在审查设计模式。我遇到了这个Multiton,但我发现很难想出一个好的现实世界用法示例。

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

5 个答案:

答案 0 :(得分:4)

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

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

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

这是多音,一个现实生活中的例子

答案 1 :(得分:1)

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

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

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

因此,应根据会议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];
    }
}

答案 2 :(得分:0)

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

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

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

Nashorn和rhino都是(通用)ScriptEngine,只有参数显示使用了哪个实现。

答案 3 :(得分: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; }
}

答案 4 :(得分:0)

只是添加到答案中,

我正在从 Cracking The Coding Interview 书中创建一个名为 OTHello 的游戏, 只有两个玩家,一个是白人玩家,另一个是黑人玩家。

所以我有一个 Player 类,每个游戏应该只有两个实例。每个实例都应该有黑色或白色。在创建了两个玩家之后,棋盘就像一个包含所有玩家、硬币、点数等的类,ETC 不应该有更多玩家打断,所以这种模式会阻止这种情况发生。

同样的道理也适用于国际象棋,在一个棋盘类实例中只能有两个玩家类实例。