PatternsCSharpProgramming/Patterns/FactoryMethod/Program.cs
Dvurechensky 3a28caed27 1.0
Main
2024-10-05 09:15:54 +03:00

120 lines
2.6 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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