2025-05-12 03:32:04 +03:00
|
|
|
|
/*
|
|
|
|
|
* Author: Nikolay Dvurechensky
|
|
|
|
|
* Site: https://www.dvurechensky.pro/
|
|
|
|
|
* Gmail: dvurechenskysoft@gmail.com
|
|
|
|
|
* Last Updated: 12 мая 2025 03:31:02
|
|
|
|
|
* Version: 1.0.7
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/* Фабричный метод
|
2024-10-05 09:15:54 +03:00
|
|
|
|
Определяет интерфейс для создания объекта,
|
|
|
|
|
но позволяет подклассам решать, какой класс создавать.
|
|
|
|
|
Позволяет делегировать создание класса
|
|
|
|
|
объектам класса.
|
|
|
|
|
*/
|
|
|
|
|
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");
|
|
|
|
|
}
|
|
|
|
|
}
|