Каково реальное использование шаблона проектирования строителя? - PullRequest
4 голосов
/ 03 мая 2009

Я читал об этом, я понимаю, что это основная функция - я хотел бы узнать пример обычного, реального использования этого шаблона.

Для справки, я работаю в основном с бизнес-приложениями, сетью и окнами, используя стек Microsoft.

Ответы [ 6 ]

5 голосов
/ 03 мая 2009

Ключевые варианты использования:

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

Таким образом, builder делает ваши конструкторы простыми, но допускает неизменность.

Вы сказали C #, но вот тривиальный пример Java:

StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World!");
System.out.println(sb.toString());

В отличие от:

String msg = "";
msg += "Hello";
msg += " ";
msg += "World!";
System.out.println(msg);
5 голосов
/ 03 мая 2009

Подумайте о маршруте строителя. Есть много вещей, которые вы можете добавить к вам. Маршрут, такой как отели, прокат автомобилей, авиабилеты, и количество элементов для каждого - от 0 до *. У Алисы может быть машина и гостиница, а у Боба два рейса, нет машины и три отеля.

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

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

Также есть хорошее описание, примеры кода и UML на Data & Object Factory .

1 голос
/ 03 мая 2009

РЕДАКТИРОВАТЬ: Вы увидите в моих комментариях, что я, возможно, бросился отвечать на этот вопрос, и запутался в процессе. Я продолжу и отредактирую это, чтобы работать с Абстрактной Фабрикой, как я думаю, что изначально предполагал, но, пожалуйста, обратите внимание, что это в основном для справки, а не обязательно как ответ на оригинальный вопрос.

Самый распространенный пример, который я видел, описывает, как создаются компоненты GUI.

Например, если вы разрабатывали форму для своего приложения, чьи компоненты графического интерфейса могли принимать несколько представлений (возможно, в зависимости от платформы, на которой вы работали), вы разработали бы абстрактную фабрику для обработки этих компонентов.

Чтобы добавить новые элементы управления в форму, код может выглядеть примерно так:

public MyForm ()
{
    GuiFactory  factory = new Win32Factory ();
    Button      btn = factory.CreateButton ();

    btn.Text = "Go!"
    btn.Location = new Point (15, 50);

    this.Controls.Add (btn);
}

Это удовлетворяет шаблону Абстрактной фабрики, потому что вы можете создавать разные экземпляры фабричного объекта для создания разных представлений созданных вами объектов без изменения клиентского кода (это простой пример, но я думаю, что обычно вы не создадите Win32Factory используя new, он будет получен через какую-то другую абстракцию).

0 голосов
/ 03 мая 2009

Иногда полезно подумать о не связанных с программным обеспечением примерах шаблонов проектирования , чтобы понять их.

У меня есть система, над которой я сейчас работаю, которая использует строителя для создания заказа. Порядок - это класс, состоящий из нескольких других классов. Мой конструктор создает и проверяет связанные классы, и, если все они действительны, он создает экземпляр класса заказа. Таким образом, я могу быть уверен, что у меня никогда не будет экземпляра заказа, в котором отсутствуют данные.

0 голосов
/ 03 мая 2009

Один случай использования, с которым я столкнулся, - это наличие нескольких источников данных. Частный случай включал кэш и базу данных. Большая часть данных была извлечена из кеша или нет. Второй загрузчик посмотрел на данные, чтобы увидеть, были ли они загружены из кэша. Запрос к базе данных завершит заполнение данных.

0 голосов
/ 03 мая 2009

Распространенным примером, который мы привыкли видеть постоянно, был «системный администратор» операционной системы. у вас был процесс, который выбрал все необходимые вам модули, настроил их и возвратил настроенный загрузочный образ.

...