/* Фабричный метод Определяет интерфейс для создания объекта, но позволяет подклассам решать, какой класс создавать. Позволяет делегировать создание класса объектам класса. */ class Program { static void Main() { #region Пример №1 - базовое var ltd = new WoodDeveloper(); ltd.Create(); var rss = new OfficeDeveloper(); rss.Create(); Creator ltdEx = new Creator(); var a1 = ltdEx.FactoryMethod(); a1.Create(); Creator rssEx = new Creator(); var a2 = rssEx.FactoryMethod(); a2.Create(); Console.ReadKey(); #endregion } } /// /// *** представления через обобщения (нельзя инициализировать через параметризированный конструктор) /// /// обобщающий тип class Creator where T : Developer, new() { public T FactoryMethod() { return new T(); } } /// /// Cтроительная компания - базовая логика /// abstract class Developer { protected string Name { get; set; } public Developer(string name) { Name = name; } /// /// Фабричный метод /// /// House public abstract House Create(); } class WoodDeveloper : Developer { public WoodDeveloper() : base("Wood Develop LTD") { } public override House Create() { return new PanelHouse(); } } class OfficeDeveloper : Developer { public OfficeDeveloper() : base("Office Develop RSS") { } public override House Create() { return new OfficeHouse(); } } /// /// Общая логика операций над строением /// abstract class House { public abstract void Build(); } /// /// Панельный дом /// class PanelHouse : House { public PanelHouse() { Build(); } public override void Build() { Console.WriteLine("Build Panel House"); } } /// /// Офисное здание /// class OfficeHouse : House { public OfficeHouse() { Build(); } public override void Build() { Console.WriteLine("Build Office House"); } }