Зачем нам нужен шаблон проектирования строителя вместо модели? - PullRequest
0 голосов
/ 23 ноября 2018

Ниже мое понимание шаблона проектирования строителя.Допустим, у нас есть класс 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 Ответ

0 голосов
/ 26 ноября 2018

Когда вы создаете класс, основная цель - уменьшить сложность вашей программы.Вы создаете класс, чтобы скрыть сложность, чтобы вам не нужно было об этом думать.Конечно, вы должны подумать об этом, когда будете писать урок.Но после того, как он написан, вы сможете забыть детали и использовать класс, не зная о его внутренней работе.

Очевидно, что в случае, который вы упомянули в своем вопросе, использование шаблона компоновщика увеличило сложность и простоиспользование модели - правильный выбор.Поскольку процесс создания вашего Product объекта довольно прост.

В других случаях создание объекта может быть сложной операцией, и вы используете шаблон проектирования компоновщика для управления этой сложностью.

ВотПример использования шаблона Builder в реальном мире: https://dzone.com/articles/builder-pattern-usage-real

...