26. Creational patterns Singleton public class Singleton<T>where T: class { private static readonlyLazy<T> instance = new Lazy<T>( () => (T)typeof(T).GetConstructor(BindingFlags.Instance |BindingFlags.NonPublic, null, new Type[0], null).Invoke(null)); public static T Instance { get { return instance.Value; } } }
27. Creational patterns Multiton Создаёт определенное число своих экземпляров и предоставляет точку доступа для работы с ними. Каждый экземпляр связан с уникальным идентификатором. public sealed class Multiton<TKey> { private static readonlyConcurrentDictionary<TKey,Multiton<TKey>>instances = new ConcurrentDictionary<TKey,Multiton<TKey>>(); private Multiton(TKey key) { /* ... */ } public static Multiton<TKey> GetInstance(TKey key) { return instances.GetOrAdd(key, x => new Multiton<TKey>(x)); } }
28.
29.
30.
31. класс порождаемого объекта определяется в момент выполнения;public abstract class SimpleElement { public uintId { get; set; } public string Title { get; set; } public virtual SimpleElementClone() { return (SimpleElement)this.MemberwiseClone(); } }
32. Creational patterns Prototype public abstract class SimpleElement { public GuidId { get; set; } public string Title { get; set; } public virtual SimpleElementClone() { return (SimpleElement)this.MemberwiseClone(); } } public void CopyObjects(IEnumerable<SimpleElement> selectedElements) { foreach(SimpleElementelementin selectedElements) { SimpleElementnewElement = element.Clone(); newElement.Id = Guid.NewGuid(); this.AddNewElement(newElement); } }