/* * ПОРОЖДАЮЩИЕ ПАТТЕРНЫ * * Глава_11: Строитель (Builder) * * - строитель отделяет конструирование сложного объекта * от его представления, так что в результате одного и того же * процесса конструирования могут получаться разные представления. */ /// /// Шаблон адреса /// class Address { public string Street { get; set; } public string House { get; set; } public Address(string street, string house) { Street = street; House = house; } } /// /// Представление с точки зрения паттерна /// class AddressElement { public string Title { get; set; } public string Value { get; set; } private List 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(); Title = title; Value = value; } private string Print(string indent = "") => ""; public override string ToString() => ""; } /// /// Конструирует корневую главную ячейку /// 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(); } /// /// Классическое представление паттерна /// 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); } }