2015-06-16 3 views
0

Привет, У меня есть сомнение в шаблоне проектирования строителя. Из видеороликов с множественными точками я понял, что этот шаблон используется, чтобы избежать сложности телескопических конструкторов в изменяемых классах. Некоторые другие сайты объясняют это как способ разработки или создания сложного объекта, сохраняя компоновщик как состав. Я полностью смущен. Пожалуйста, уточните то же самое?Builder pattern, где следует применять

+1

См. Этот ответ: http://stackoverflow.com/a/1953567/1155984 –

+0

[Пункт 2. Страница 11 и далее] (http://uet.vnu.edu.vn/~chauttm/e-books/ java/Effective.Java.2nd.Edition.May.2008.3000th.Release.pdf) –

+0

Сказанное быстро, интерес шаблона проектирования Builder заключается в том, чтобы иметь несколько классов-конструкторов (по одному на тип инициализации) и один директор класса для управления желаемым строитель. Интерес шаблона Factory заключается в том, что вызывающий абонент не должен знать реализацию, а просто интерфейс сборки объекта. Тезисы 2 гола не являются несовместимыми. –

ответ

2

Сложные конструкторы могут быть плохими для неизменяемых или изменяемых классов.

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

Очень сложно выяснить, как использовать эти конструкторы. Даже если они встроены в валидацию, вам все равно нужно проверить, что вы создаете ее правильно. У строителя могут быть методы, которые дают подсказки или заставляют людей создавать его правильно. Например, builder.copy(obj).setName("newObj").build(). Это дает нам подсказку о том, как скопировать объект, это может быть лучше, чем просмотр конструкторов для правильного использования.

Другая проблема заключается в том, что вы должны предоставить все необходимые конструкторы args. Даже если есть нормальные значения по умолчанию, вы можете быть вынуждены что-то поставлять. Строитель может содержать значения по умолчанию, поэтому вы задаете только интересующие вас параметры.

Другая проблема заключается в том, что большой конструктор может иметь несколько параметров одного и того же типа в строке. Он просит кого-то случайно ошибиться в неправильном значении. Строитель заставляет вас вызвать метод со значимым именем.

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

Связанный ответ в комментариях имеет более веские причины.