Мультитон (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 - можна надати значення лише в конструкторі (один раз)