170 lines
4.6 KiB
C#
170 lines
4.6 KiB
C#
/*
|
||
* ПОРОЖДАЮЩИЕ ПАТТЕРНЫ
|
||
*
|
||
* Глава_11: Строитель (Builder)
|
||
*
|
||
* - строитель отделяет конструирование сложного объекта
|
||
* от его представления, так что в результате одного и того же
|
||
* процесса конструирования могут получаться разные представления.
|
||
*/
|
||
|
||
/// <summary>
|
||
/// Шаблон адреса
|
||
/// </summary>
|
||
class Address
|
||
{
|
||
public string Street { get; set; }
|
||
public string House { get; set; }
|
||
|
||
public Address(string street, string house)
|
||
{
|
||
Street = street;
|
||
House = house;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Представление с точки зрения паттерна
|
||
/// </summary>
|
||
class AddressElement
|
||
{
|
||
public string Title { get; set; }
|
||
public string Value { get; set; }
|
||
private List<AddressElement> Elements { get; set; }
|
||
|
||
public void AddElement(string title, string value)
|
||
{
|
||
Elements.Add(new AddressElement(title, value));
|
||
}
|
||
|
||
public AddressElement(string title, string value)
|
||
{
|
||
Elements = new List<AddressElement>();
|
||
Title = title;
|
||
Value = value;
|
||
}
|
||
|
||
private string Print(string indent = "") => "";
|
||
public override string ToString() => "";
|
||
}
|
||
|
||
/// <summary>
|
||
/// Конструирует корневую главную ячейку
|
||
/// </summary>
|
||
class AddressBuilder
|
||
{
|
||
AddressElement address;
|
||
|
||
public static AddressBuilder Build(string title, string value)
|
||
=> new AddressBuilder { address = new AddressElement(title, value) };
|
||
|
||
private AddressBuilder() { }
|
||
|
||
public AddressBuilder AddItem(string title, string value)
|
||
{
|
||
address.AddElement(title, value);
|
||
return this;
|
||
}
|
||
|
||
public override string ToString() => address.ToString();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Классическое представление паттерна
|
||
/// </summary>
|
||
class Address_Classic
|
||
{
|
||
public string? Country { get; set; }
|
||
public string? City { get; set; }
|
||
public string? Street { get; set; }
|
||
public string? House { get; set; }
|
||
public string? Number { get; set; }
|
||
public override string ToString()
|
||
{
|
||
return $"Country: {(string.IsNullOrEmpty(Country) ? "unknown" : Country)}\n" +
|
||
$"City: {(string.IsNullOrEmpty(City) ? "unknown" : City)}\n" +
|
||
$"Street: {(string.IsNullOrEmpty(Street) ? "unknown" : Street)}\n" +
|
||
$"House: {(string.IsNullOrEmpty(House) ? "unknown" : House)}\n" +
|
||
$"Number: {(string.IsNullOrEmpty(Number) ? "unknown" : Number)}\n";
|
||
}
|
||
}
|
||
|
||
interface IAddressBuilder
|
||
{
|
||
IAddressBuilder SetCountry(string country);
|
||
IAddressBuilder SetCity(string city);
|
||
IAddressBuilder SetStreet(string street);
|
||
IAddressBuilder SetHouse(string house);
|
||
IAddressBuilder SetNumber(string number);
|
||
Address_Classic Build();
|
||
}
|
||
|
||
class AddressBuilder_Classic : IAddressBuilder
|
||
{
|
||
Address_Classic address_Classic;
|
||
public AddressBuilder_Classic() => address_Classic = new Address_Classic();
|
||
public Address_Classic Build() => address_Classic;
|
||
|
||
public IAddressBuilder SetCity(string city)
|
||
{
|
||
address_Classic.City = city;
|
||
return this;
|
||
}
|
||
|
||
public IAddressBuilder SetCountry(string country)
|
||
{
|
||
address_Classic.Country = country;
|
||
return this;
|
||
}
|
||
|
||
public IAddressBuilder SetHouse(string house)
|
||
{
|
||
address_Classic.House = house;
|
||
return this;
|
||
}
|
||
|
||
public IAddressBuilder SetNumber(string number)
|
||
{
|
||
address_Classic.Number = number;
|
||
return this;
|
||
}
|
||
|
||
public IAddressBuilder SetStreet(string street)
|
||
{
|
||
address_Classic.Street = street;
|
||
return this;
|
||
}
|
||
}
|
||
|
||
|
||
class Program
|
||
{
|
||
public static void Main(string[] args)
|
||
{
|
||
AddressBuilder addressBuilder =
|
||
AddressBuilder
|
||
.Build("Адрес", "Рабочий адрес")
|
||
.AddItem("Индекс", "214000")
|
||
.AddItem("страна", "РФ");
|
||
|
||
Console.WriteLine("");
|
||
|
||
//Классический конструктор
|
||
|
||
Address_Classic address_Classic = new AddressBuilder_Classic()
|
||
.SetCountry("country")
|
||
.SetCity("Moscow")
|
||
.SetHouse("Home")
|
||
.SetNumber("25")
|
||
.Build();
|
||
|
||
Console.WriteLine(address_Classic);
|
||
|
||
address_Classic = new AddressBuilder_Classic()
|
||
.SetCountry("New York")
|
||
.SetStreet("Skobelevskaya")
|
||
.Build();
|
||
|
||
Console.WriteLine(address_Classic);
|
||
}
|
||
} |