2012-03-09 33 views
1

現在、デザインパターンをレビューしています。この1つを見つけたのは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では1つのオブジェクトのみがマルチスレッド環境でのキーのために作成されます保証するデザインパターンです。したがって、複数のスレッドが同じキーを渡す場合、そのキーの同じオブジェクト(ロックオブジェクト)を取得する必要があります。鍵となるシングルトンと呼ぶかもしれません。

もし私たちがを持っていれば、システム全体でロック対象がです。アプリケーションの場合はsingleTonとなります。しかしここでは複数のロックオブジェクトがあります。各オブジェクトはキーでマッピングされます。

です。複数の会議があると仮定し、会議の発信者がそれぞれの会議IDを使用して1つずつ(会議の発信者の数をカウントするために)会議の参加者を参加させる必要があるとします。私はシングルトンのオブジェクトを持っている場合でも、別の会議からの発信者はブロックされます。だから私は各会議のためのロックが必要です。

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

私はJavaの ScriptEngineの例は良い例だと思います
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

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

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

Nashornとサイは、(一般的な)ScriptEngine年代両方の実装が使用されている唯一のパラメータショーです。

0

もう一つの例:

はあなたには、いくつかの監視カメラがあり、各カメラは1とコントローラが1つしか持つことができますと仮定します。

この場合、カメラクラスのマルチトンを取得する必要があります。それは<key, camera>ペアを含むハッシュマップを持っています。 like:

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; } 
} 
関連する問題