Шаблон Builder vs Factory Method

Я читал о шаблоне Builder и, как обычно, меня перепутали с шаблоном Factory.

Я видел хорошую статью, которая показывает разницу между абстрактной фабрикой и шаблоном Builder.

http://champika-nirosh.blogspot.in/2008/04/what-is-difference-between-abstract.html

Но моя путаница заключается в том, что, более, чем шаблон Builder, похожий на Abstract Factory, я чувствую, что он похож на шаблон Factory Method. Не уверен, что мое понимание верно. Но в Фабричном методе мы также используем отдельную фабрику (Метод в Конкретной Фабрике), чтобы создать один конкретный объект (не семейство продуктов). В этом сценарии, как Builder отличается от шаблона Factory Method. Я знал, что для создания объекта требуется больше шагов, кроме того, есть ли какой-то конкретный сценарий, который нам нужно использовать один над другим? Пожалуйста, ведите меня.

Благодарю.

1 ответ

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

И абстрактный фабричный, и фабричный метод создают экземпляры неизвестных типов. Обычно они возвращают класс, соответствующий интерфейсу, но вы не знаете (и не должны заботиться), каким будет конкретный тип. Чтобы использовать картинку из этой ссылки, она использует WindowsFactory, то есть абстрактная фабрика возвращает экземпляр, совместимый с Windows. Если бы ваша фабрика была LinuxFactory, вы могли бы вернуть объект, работающий в Linux. Также обратите внимание, что вы, вероятно, не знаете, если у вас есть LinuxFactory или WindowsFactory, просто у вас есть Factory определенного типа.

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

MyInterfaceType myInstance = myFactory.getTheItemOfMyInterfaceType();

Шаблон строителя больше относится к созданию сложных объектов, которые могут быть, а могут и не быть (но, вероятно, есть) известного типа. В этом случае вы ожидаете, что сложный ряд вызовов создаст тип, часто устанавливая один параметр за другим. Поскольку существует много известных параметров и аргументов, вы обычно знаете, какой тип объекта вы собираетесь получить от него (не обязательно, но это более вероятно, чем с абстрактной фабрикой). Builder используется, когда построение объекта является сложным, но не обязательно полиморфным (это может быть полиморфным, но это не предпосылка шаблона). Вызов конструктора для создания чего-либо может быть (см. Android AlertDialog для некоторых реальных примеров):

Builder b = new Builder();
b.setSomeValueA(myChoiceForA);
b.setSomeValueB(myChoiceForB);
MyInterfaceType myInstance = b.build();

Надеюсь, это поможет.

Другие вопросы по тегам