January
Паттерн 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 - на том, как оно создается.
6 Comments »
RSS feed for comments on this post.
Както не доконца ясно, где это мжет понадобиться. Почему бы например не обойтись без класса директор, поместив его метод constructComputer в абстрактный класс ComputerBuilder?
Обрати внимание на этот текст из статьи:
Класс Director делает комплексное построение продукта (в нашем случае компьютера) и не заботится о том, как именно создаются его части.
Может на этом примере будет понятнее: ты строишь дом, у тебя есть бригада строителей разных специализаций (каждая специализация - это метод из класса Builder). Director - это ты :). Что ты скажешь строителям, то они и будут делать. Если скажешь им сначала стены построить, а только потом залить фундамент, то они так и сделают. Но ты, как настоящий Director, знаешь последовательность, в которой строить дом. С другой стороны, тебя не сильно интересует сам процесс, например, возведения стен (кирпичи будут класть слева направо или наоборот).
А где в языке Java используется паттерн Builder?
Ну вообще много где используется. Зачастую с паттерном Factory. Builder+Director помогает инкапсулировать наши действия.
Наиболее ярко полезность патерна ощущается при использовании слгожных объектов с глубокой вложенноситью параметров. В случае необходимости чот-то изменить (причем зачастую кардинально), процес происходит на 80% безполезненно. Director - скорре логический помощник, помогающий в дальнейшем легко ориентироваться в процессе билда объекта.
Правильно ли я понимаю, что Директор - это фактически Фасад (Facade)? Или есть принципиальная разница?