以下是我对生成器设计模式的理解。假设我们有一个如下所示的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);
}
}