January
2007
Паттерн Builder (Строитель)
Posted in: Паттерны проектирования |
Паттерн Builder является паттерном создания объектов (creational pattern). Суть его заключается в том, чтобы отделить процесс создания некоторого сложного объекта от его представления. Таким образом, можно получать различные представления объекта, используя один и тот же “технологический” процесс.
Паттерн Строитель иногда путают с паттерном проектирования Factory. ? не удивительно, так как они действительно во многом схожи.
В этой статье я опи?у неболь?ой пример реализации Builder’a на языке Java, а так же попробую коротко объяснить разницу между Builder и Factory.
Предположим, нам необходимо написать программу для сборки копьютера. Для начала нам нужен сам компьютер и абстрактый Builder для его создания:
class Computer {
private String display = null;
private String systemBlock = null;
private String manipulators = null;
public void setDisplay(String display) {
this.display = display;
}
public void setSystemBlock(String systemBlock) {
this.systemBlock = systemBlock;
}
public void setManipulators(String manipulators) {
this.manipulators = manipulators;
}
}
abstract class ComputerBuilder {
protected Computer computer;
public Computer getComputer() {
return computer;
}
public void createNewComputer() {
computer = new Computer();
}
public abstract void buildSystemBlock();
public abstract void buildDisplay();
public abstract void buildManipulators();
}
Теперь, нам нужно предоставить хотя бы одну имплементацию построителя (иными словами, нам нужен конкретный Builder):
class CheapComputerBuilder extends ComputerBuilder {
public void buildSystemBlock() {
computer.setSystemBlock("Everest");
}
public void buildDisplay() {
computer.setDisplay("CRT");
}
public void buildManipulators() {
computer.setManipulators("mouse+keyboard");
}
}
Далее, еще одна важная часть на?ей программы - класс Director:
class Director {
private ComputerBuilder computerBuilder;
public void setComputerBuilder(ComputerBuilder computerBuilder) {
this.computerBuilder = computerBuilder;
}
public Computer getComputer() {
return computerBuilder.getComputer();
}
public void constructComputer() {
computerBuilder.createNewComputer();
computerBuilder.buildSystemBlock();
computerBuilder.buildDisplay();
computerBuilder.buildManipulators();
}
}
Вы наверное спросите, а зачем вообще создавать этот класс, ведь можно сразу вызывать методы Builder’a из клиента. Класс Director делает комплексное построение продукта (в на?ем случае компьютера) и не заботиться о том, как именно создаются его части.
Те, кто читал предыдущие статьи о паттернах проектирования, наверняка увидят в классе Director использование паттерна Strategy. Множество построителей компьютера - ComputerBuilder - это и есть стратегии.
Ну и наконец, класс-клиент:
class BuilderExample {
public static void main(String[] args) {
Director director = new Director();
ComputerBuilder cheapComputerBuilder = new CheapComputerBuilder();
director.setComputerBuilder(cheapComputerBuilder);
director.constructComputer();
Computer computer = director.getComputer();
}
}
Преимущества использования паттерна Builder:
- дает боль?ий контроль над процессом создания объектов;
- позволяет варьировать внутреннее представление объекта;
- отделяет процесс конструирования объекта от его внутреннего представления
На последок несколько слов о разнице между паттерном Factory и паттерном Строитель. Factory сосредотачивается на том, что именно создается, а Builder - на том, как оно создается.
13 Comments »
RSS feed for comments on this post.
Както не доконца ясно, где это мжет понадобиться. Почему бы например не обойтись без класса директор, поместив его метод constructComputer в абстрактный класс ComputerBuilder?
Обрати внимание на этот текст из статьи:
Класс Director делает комплексное построение продукта (в на?ем случае компьютера) и не заботится о том, как именно создаются его части.
Может на этом примере будет понятнее: ты строи?ь дом, у тебя есть бригада строителей разных специализаций (каждая специализация - это метод из класса Builder). Director - это ты :). Что ты скаже?ь строителям, то они и будут делать. Если скаже?ь им сначала стены построить, а только потом залить фундамент, то они так и сделают. Но ты, как настоящий Director, знае?ь последовательность, в которой строить дом. С другой стороны, тебя не сильно интересует сам процесс, например, возведения стен (кирпичи будут класть слева направо или наоборот).
А где в языке Java используется паттерн Builder?
Ну вообще много где используется. Зачастую с паттерном Factory. Builder+Director помогает инкапсулировать на?и действия.
Наиболее ярко полезность патерна ощущается при использовании слгожных объектов с глубокой вложенноситью параметров. В случае необходимости чот-то изменить (причем зачастую кардинально), процес происходит на 80% безполезненно. Director - скорре логический помощник, помогающий в дальней?ем легко ориентироваться в процессе билда объекта.
Правильно ли я понимаю, что Директор - это фактически Фасад (Facade)? ?ли есть принципиальная разница?
супер! спасибо за пример!!
как раз искала что-нибудь подобное
а не проще было бы сделать класс Computer и класс Director? тоже самое было бы
Господа, чувствеется путаница между кислым и мягким. Сложность объектов тут ни при чем, это как частный случай. Тут главное следующий момент. Вот вы написали код креейта некого объекта. Со временем объект поменялся или добавились его вариации. Что, переписывать получение и последующее использование? ?спользуя данный паттерн креейт и юзание объектов будет обно и тоде на все времена, а вам остается тока дописывать вновь требуемые классы. Очень удобно при использовании SpringFrameWork.
На самом деле в яве это часто используется поблизости от XML.
Cмотри классы javax.xml.parsers.DocumentBuilder и им подобные.
возможно это детали…но я б сделал для Director слудующий конструктор
public Director(ComputerBuilder computerBuilder) {
this.computerBuilder = computerBuilder;
}
Пи?у комент, только, чтобы помочь автору статью луч?е. Так как, Вы описываете именно паттерн, а не реализацию сборщика компа, то вначале статьи опи?ите границу паттерна, т.е.: someclass - делает то-то; …
В общем, как в остальных ва?их статьях. Тут тоже все понять удалось, но немножко сложнее статья на мозг легла.
А вообще, очень полезный сайт. Спасибо боль?ое. Буду читать ![]()
Спасибо за статью, только вопрос: почему по всему сайту текст некорректно отображается на всех браузерах, хотя с другими сайтами все ок.
Например вместо буквы ш-�? итд