現在、デザインパターンを検討中です。この 1 つのMultitonに出くわしましたが、実際の使用例を考えるのは難しいと思います。
では、Multiton パターンの強みが活かされる主な分野は何でしょうか?
現在、デザインパターンを検討中です。この 1 つのMultitonに出くわしましたが、実際の使用例を考えるのは難しいと思います。
では、Multiton パターンの強みが活かされる主な分野は何でしょうか?
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
これはマルチトーンであり、実際の例です
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];
}
}
Javaの例は良い例だと思いますScriptEngine
:
// For nashorn
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
// For rhino
ScriptEngine engine = new ScriptEngineManager().getEngineByName("rhino");
Nashorn と rhino はどちらも (ジェネリック)ScriptEngine
であり、パラメーターのみがどの実装が使用されているかを示します。