为什么我们需要建造者设计模式而不是模型?

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

1
建造者模式可以带来很多好处,但也要记住,设计模式只有在有意义的情况下才应该使用。在您的情况下,使用模型可能更有意义(我不确定),但这并不仅仅是设计模式-好,没有设计模式-坏的问题。 - Dave
真的。你能否举一个现实世界的例子,在这种情况下,模型是不够用的? - Priyanka
这是一篇不错的博客文章,恰巧今天早上读到了它 http://blog.ploeh.dk/2017/08/15/test-data-builders-in-c/ - Dave
1个回答

1
当你创建一个类时,主要的目标是减少程序的复杂性。你创建一个类来隐藏复杂性,这样你就不需要考虑它。当然,在编写类时,你需要考虑它。但在编写完成后,你应该能够忘记细节并使用类,而无需了解其内部工作原理。
显然,在你问题中提到的情况下,使用构建器模式会增加复杂性,只使用模型是正确的选择。因为创建你的Product对象的过程非常简单。
在其他情况下,创建一个对象可能是一个复杂的操作,你可以使用构建器设计模式来管理这种复杂性。
以下是构建器模式实际使用的示例: https://dzone.com/articles/builder-pattern-usage-real

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接