Ниже мое понимание шаблона проектирования строителя.Допустим, у нас есть класс Product, как показано ниже.
public class Product
{
public string Name { get; set; }
public string Description { get; set; }
public int NumberOfProducts { get; set; }
public decimal Price { get; set; }
public bool IsDurable { get; set; }
}
Интерфейс компоновщика:
public interface IBuilder
{
void SetName(string value);
void SetPrice(decimal value);
void SetIsDurable(bool value);
void SetNumberOfProducts(int value);
void SetDescription(string value);
Product GetProduct();
}
Конкретный конструктор, который имеет методы установки и получает объект продукта.
public class ConcreteBuilder : IBuilder
{
Product product = new Product();
public Product GetProduct()
{
return product;
}
public void SetDescription(string value)
{
product.Description = value;
}
public void SetIsDurable(bool value)
{
product.IsDurable = value;
}
public void SetName(string value)
{
product.Name = value;
}
public void SetNumberOfProducts(int value)
{
product.NumberOfProducts = value;
}
public void SetPrice(decimal value)
{
product.Price = value;
}
}
В реальном сценарии свойства продукта должны заполняться пользовательскими данными, а не жестко кодироваться, как это.В этом случае нам также необходимо отправить продукт для создания объекта продукта.
public Product ConstructProduct(IBuilder builder)
{
builder.SetDescription("P");
builder.SetIsDurable(false);
builder.SetName("My Name");
builder.SetPrice(10);
builder.SetNumberOfProducts(5);
return builder.GetProduct();
}
Используйте объект построителя в клиенте, как показано ниже:
public class Client
{
public void AddProduct()
{
ConcreteBuilder builder = new ConcreteBuilder();
var builtProduct = new Director().ConstructProduct(builder);
Console.WriteLine(builtProduct.Description);
}
}
Вместо использования шаблона построителя, как показано выше, почему мы не можем использовать сам класс модели Product, как показано ниже, когда в конструкторе нужно добавить много свойств (чтобы избежать телескопического построения анти-шаблона)?Если есть какие-либо дополнительные свойства, они могут быть обнулены.
public class Client
{
Product _prod;
public Client(Product prod)
{
_prod = prod;
}
public void AddProduct()
{
// Code to add product
Console.WriteLine(_prod.Description);
}
}