ソフトウェア エンジニアリングにおいて、マルチトン パターンはシングルトン パターンを一般化した設計パターンです。シングルトンではクラスのインスタンスを 1 つしか作成できませんが、マルチトン パターンでは複数のインスタンスを制御された方法で作成でき、マップを使用して管理できます。
アプリケーションごとに1 つのインスタンス( Java プログラミング言語java.lang.Runtimeのオブジェクトなど) を持つのではなく、マルチトン パターンではキーごとに1 つのインスタンスが確保されます。
マルチトンパターンは、オブジェクト指向プログラミングの教科書として高く評価されている『デザインパターン』にはパターンとして明示的には登場しません。[1]しかし、この本では、シングルトンのレジストリを使用してシングルトンのサブクラス化を可能にすることが説明されており、[2]これが本質的にマルチトンパターンです。[要出典]
説明
マルチトンは同期アクセスを備えたハッシュ テーブルであるように見えますが、2 つの重要な違いがあります。まず、マルチトンではクライアントがマッピングを追加できません。次に、マルチトンは null または空の参照を返すことはありません。代わりに、関連付けられたキーを持つ最初の要求でマルチトン インスタンスを作成して保存します。同じキーを持つ後続の要求では、元のインスタンスが返されます。ハッシュ テーブルは単なる実装の詳細であり、唯一の可能なアプローチではありません。このパターンにより、アプリケーションでの共有オブジェクトの取得が簡素化されます。
オブジェクト プールはインスタンスではなくクラスに関連付けられたメンバーとして 1 回だけ作成されるため、マルチトンはツリー構造に進化するのではなく、フラットな動作を維持します。
マルチトンは、マルチトンの単一のディレクトリ(つまり、すべてのキーは本質的に同じ名前空間にあります)への集中アクセスを提供するという点でユニークです。プール内の各マルチトンインスタンスは、独自の状態を持ちます。このように、このパターンは、システムに不可欠なオブジェクトのインデックス付きストレージ(たとえば、 LDAPシステムによって提供されるものなど)を推奨しています。ただし、マルチトンは、無数の分散システムではなく、単一のシステムによる広範な使用に限定されています。
欠点
このパターンは、シングルトンパターンと同様に、アプリケーションに グローバル状態を導入するため、ユニットテストをはるかに困難にします[3] 。
ガベージコレクション言語では、オブジェクトへのグローバルな強い参照が導入されるため、メモリリークの原因になる可能性があります。
実装
Java では、マルチトン パターンは列挙型を使用して実装でき、その型の値はインスタンスに対応します。単一の値を持つ列挙型の場合は、シングルトン パターンになります。
C# では、次の例に示すように列挙型を使用することもできます。
システムの使用;
System.Collections.Genericを使用します。
パブリック列挙型MultitonType
{
ゼロ、
1つ、
二
}
パブリッククラスMultiton
{
プライベート静的読み取り専用辞書< MultitonType 、Multiton >インスタンス=
新しい辞書< MultitonType 、Multiton > ();
プライベートMultitonTypeタイプ;
プライベートMultiton ( MultitonType型)
{
this.type = type ;です。
}
パブリックスタティックMultiton GetInstance ( MultitonType型)
{
// 遅延初期化(記述どおりにはスレッドセーフではない)
// スレッドの安全性が必要な場合は、ダブルチェックロックの使用を推奨します
if ( ! instances . TryGetValue ( type , out var instance ))
{
インスタンス=新しいMultiton ( type );
インスタンス。(型、インスタンス)を追加します。
}
インスタンスを返します。
}
パブリックオーバーライド文字列ToString ()
{
return "私のタイプは " + this . type ;
}
// 使用例
パブリック静的void Main ()
{
var m0 = Multiton.GetInstance ( MultitonType.Zero ) ;
var m1 = Multiton.GetInstance ( MultitonType.One ) ;
var m2 = Multiton.GetInstance ( MultitonType.Two ) ;
コンソール.WriteLine ( m0 ) ;
コンソール.WriteLine ( m1 ) ;
コンソール.WriteLine ( m2 ) ;
}
}
参考文献
外部リンク
- Ruby言語でのマルチトン実装
- ActionScript 3 の PureMVC フレームワークにおけるマルチトンの使用
- C# マルチトンの実装、使用例、メモリの問題に関する説明を含む記事
