В чем разница между шаблоном Builder Design и шаблоном Factory Design?

576
задан Ravindra babu 3 June 2016 в 15:05
поделиться

5 ответов

В шаблонах проектирования обычно не существует «более выгодного» решения, которое бы работало во всех случаях. Это зависит от того, что вам нужно реализовать.

Из Википедии:

  • Строитель фокусируется на создании сложный объект шаг за шагом. Аннотация Фабрика подчеркивает семейство продуктов объекты (простые или сложные). Строитель возвращает товар как окончательный шаг, но насколько абстрактно Завод обеспокоен, продукт получает Возвращается немедленно.
  • Builder часто создает Composite.
  • Часто проекты начинаются с использования фабричного метода (менее сложный, более сложный настраиваемые, подклассы размножаются) и развиваться к абстрактной фабрике, Прототип, или Строитель (более гибкий, более сложный) как дизайнер обнаруживает, где больше гибкости
  • Иногда шаблоны творчества дополняют друг друга: Строитель может использовать один из других шаблонов для реализации какие компоненты создаются Аннотация Фабрика, Строитель и Прототип могут использовать синглтон в их реализации.

Запись в Википедии для шаблона проектирования фабрики: http://en.wikipedia.org/wiki/Factory_method_pattern

Запись в Википедии для шаблона проектирования строителя: http://en.wikipedia.org/wiki/Builder_pattern

433
ответ дан 22 November 2019 в 21:58
поделиться

Both are Creational patterns, to create Object.

1) Factory Pattern - Assume, you have one super class and N number of sub classes. The object is created depends on which parameter/value is passed.

2) Builder pattern - to create complex object.

Ex: Make a Loan Object. Loan could be house loan, car loan ,
    education loan ..etc. Each loan will have different interest rate, amount ,  
    duration ...etc. Finally a complex object created through step by step process.
16
ответ дан 22 November 2019 в 21:58
поделиться

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

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

58
ответ дан 22 November 2019 в 21:58
поделиться

Фабричный шаблон почти можно рассматривать как упрощенную версию шаблона Builder.

В Фабричный шаблон , фабрика отвечает за создание различных подтипов объекта в зависимости от потребностей.

Пользователю фабричного метода не нужно знать точный подтип этого объекта. Пример фабричного метода createCar может вернуть объект Ford или Honda .

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

Для продолжения работы с примером автомобиля у вас может быть метод конструктора createCar , который создает Honda Типизированный объект с 4-цилиндровым двигателем, или Honda -типовый объект с 6 цилиндрами. Шаблон построителя учитывает эту более тонкую гранулярность.

Диаграммы как шаблона Строителя , так и шаблона фабричного метода доступны в Википедии.

272
ответ дан 22 November 2019 в 21:58
поделиться

Основное различие между ними - то, что шаблон Разработчика , прежде всего описывает создание сложных объектов шаг за шагом. В Шаблоне "абстрактная фабрика" акцент находится на семейства продуктов объектов . Разработчик возвращает продукт в последний шаг . В то время как в Шаблоне "абстрактная фабрика" продукт доступен сразу .

Пример: Позвольте говорят, что мы создаем Лабиринт

1. Абстрактная Фабрика:

Maze* MazeGame::CreateMaze (MazeFactory& factory) {
Maze* maze = factory.MakeMaze(); /// product is available at start!!
 /* Call some methods on maze */
return maze;
}

2. Разработчик:

Maze* MazeGame::CreateMaze (MazeBuilder& builder) {
builder.buildMaze(); /// We don't have access to maze
 /* Call some methods on builder */
return builder.GetMaze();
}
2
ответ дан 22 November 2019 в 21:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: