3

現在、デザインパターンを検討中です。この 1 つのMultitonに出くわしましたが、実際の使用例を考えるのは難しいと思います。

では、Multiton パターンの強みが活かされる主な分野は何でしょうか?

4

5 に答える 5

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

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

ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

これはマルチトーンであり、実際の例です

于 2012-05-09T13:08:56.693 に答える
3

Multitonマルチスレッド環境でKey に対して 1 つのオブジェクトのみが作成されるようにする設計パターンです。そのため、複数のスレッドが同じキーを渡そうとすると、そのキーに対して同じオブジェクト (ロック オブジェクト) を取得する必要があります。キーベースのシングルトンと呼ぶこともできます。

システム全体で 1 つのロック オブジェクトしかない場合。それはsingleTonあなたのアプリケーションのためです。しかし、ここでは複数のロック オブジェクトがあります。キーでマップされた各オブジェクト。

一例は次のとおりです。複数の会議があり、会議の発呼者がそれぞれの会議 ID を使用して (会議の発呼者の数をカウントするために) 1 つずつ参加できるようにする必要があるとします (会議オブジェクトごとに同期)。シングルトン オブジェクトがある場合、別の会議からの発信者でさえブロックされます。そのため、会議ごとにロックが必要です。

そのため、会議ロック オブジェクトは会議 ID に基づいて作成する必要があります。また、複数のスレッドが同じ会議 ID (マルチトン キー) を持つ同じ会議オブジェクトにアクセスしようとすると、システム内で同期が終了する必要があります。そのため、2 人の発呼者が同時に同じ会議にダイヤルすると、同期されます。

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];
    }
}
于 2015-03-17T07:41:54.243 に答える
0

Javaの例は良い例だと思いますScriptEngine

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

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

Nashorn と rhino はどちらも (ジェネリック)ScriptEngineであり、パラメーターのみがどの実装が使用されているかを示します。

于 2016-01-21T09:21:25.797 に答える