120 lines
2.6 KiB
C#
120 lines
2.6 KiB
C#
|
/* Фабричный метод
|
|||
|
Определяет интерфейс для создания объекта,
|
|||
|
но позволяет подклассам решать, какой класс создавать.
|
|||
|
Позволяет делегировать создание класса
|
|||
|
объектам класса.
|
|||
|
*/
|
|||
|
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");
|
|||
|
}
|
|||
|
}
|