1 20K ru

Порождающие паттерны: Паттерн «Строитель» (Builder)

Categories: 💻 Programming

Назначение: Строитель отделяет конструирование сложного объекта от его представления, так что в результате одного и того же процесса конструирования могут получаться разные представления.

Когда использовать паттерн Строитель?

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

  • Когда необходимо обеспечить получение различных вариаций объекта в процессе его создания

Паттерн «Строитель» довольно часто применяется в современных приложениях, но не в том виде, в котором он был описан «бандой четырех». На практике строитель все так же отвечает за создание объектов, но гораздо реже обладает всеми изначальными свойствами. Классическая диаграмма классов паттерна «Строитель» приведена на рисунке:

UML схема паттерна строитель

UML схема паттерна builder

Участники:

  1. Builder определяет интерфейс конструирования продукта по частям;
  2. Director управляет процессом создания, не зная, какой продукт будет создан в результате;
  3. ConcreteBuilder — конкретный строитель, который создает только известный ему объект класса Product.

Схема примера использования паттерна "builder"  из реальной жизни:

Схема примера использования паттерна "builder"  из реальной жизни

Реализация шаблона "строитель" на C#

 class Roof
    {
        public Roof()
        {
            Console.WriteLine("Крыша построена");
        }
    }
  class Basement
    {
        public Basement()
        {
            Console.WriteLine("Подвал построен");
        }
    }
  
  class House
    {
        ArrayList parts = new ArrayList();

        public void Add(object part)
        {
            parts.Add(part);
        }
    }
  class Storey
    {
        public Storey()
        {
            Console.WriteLine("Этаж построен");
        }
    }

 abstract class Builder
    {
        public abstract void BuildBasement();
        public abstract void BuildStorey();
        public abstract void BuildRoof();
        public abstract House GetResult();
    }

 class ConcreteBuilder : Builder
    {
        House house = new House();

        public override void BuildBasement()
        {
            house.Add(new Basement());
        }

        public override void BuildStorey()
        {
            house.Add(new Storey());
        }

        public override void BuildRoof()
        {
            house.Add(new Roof());
        }

        public override House GetResult()
        {
            return house;
        }
    }

Output

Подвал построен
Этаж построен
Крыша построена

 

Comments:

Please log in to be able add comments.
👍