-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
128 lines (111 loc) · 2.78 KB
/
Program.cs
File metadata and controls
128 lines (111 loc) · 2.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
* Author: Nikolay Dvurechensky
* Site: https://dvurechensky.pro/
* Gmail: dvurechenskysoft@gmail.com
* Last Updated: 27 апреля 2026 09:40:39
* Version: 1.0.254
*/
/* Фабричный метод
Определяет интерфейс для создания объекта,
но позволяет подклассам решать, какой класс создавать.
Позволяет делегировать создание класса
объектам класса.
*/
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");
}
}