Мультитон (Multiton pattern)
Заснований на шаблоні одинак
Передаємо ключ при створенні, і якщо такого об'єкта з таким ключем ще не було, то його створюємо
public sealed class Multiton
{
private static readonly ConcurrentDictionary<string, Multiton> _instances
= new ConcurrentDictionary<string, Multiton>();
private Multiton(string key) { /* SKIPPED */ }
public static Multiton GetInstance(string key)
{
return Multiton._instances.GetOrAdd(key, (x) => new Multiton(x));
}
internal void DoSomething()
{
Console.WriteLine(this.GetHashCode());
}
}
public static void Main()
{
Multiton obj1 = Multiton.GetInstance("instance-id-1");
obj1.DoSomething();
Multiton obj2a = Multiton.GetInstance("instance-id-2");
obj2a.DoSomething();
Multiton obj2b = Multiton.GetInstance("instance-id-2");
obj2b.DoSomething();
Console.ReadKey();
}
37121646
45592480
45592480
ConcurrentDictionary - потокобезпечна колекція "ключ-значення", доступ до якої можуть одночасно отримувати кілька потоків
readonly - можна надати значення лише в конструкторі (один раз)