Общее·количество·просмотров·страницы

Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи

среда, 20 октября 2010 г.

Паттерн Строитель (Builder)

Строитель (Builder) - порождающий шаблон проектирования, который выделяет процесс создания сложного объекта так, чтобы различные реализации строителя могли бы создавать различные реализации объекта. UML диаграмма паттерна Строитель представлена ниже (взято из Wikipedia):



Объекты на диаграмме:

  • Builder - абстрактный строитель, определяющий интерфейс

  • Concrete Builder - предоставляет конкретную реализацию строителя. Конкретный строитель создает и собирает части объекта в единое целое.

  • Director - класс Директора отвечает за задание корректной последовательности конструирования объекта. Класс получает Конкретного Строителя, как параметр, и выполняет необходимые операции с ним.

  • Product - конечный продукт. Создается Директором с помощью Коннкретного Строителя


Мотивы применения паттерна:

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

  • процесс конструирования должен обеспечивать различные представления конструируемого объекта


Плюсы применения паттерна Строитель:

  • изолирует код, реализующий конструирование и представление

  • предоставляет полный контроль над процессом создания объекта

  • позволяет независимо изменять ход процесса создания объекта



Пусть имеется код создания некоторого объекта. Со временем, объект меняется, добавляются новые вариации объекта, появляются новые методы. Без данного паттерна пришлось бы переписывать код создания объекта и его последующего использования столько раз, сколько произошло изменений и во всех местах, где этот объект создается. При использовании паттерна Строитель код и порядок создания объекта инкапсулирован в класс Конкретного Строителя. При изменении процесса создания изменить код придется только в одном месте - в этом Конкретном Строителе. При добавлении новой вариации объекта придется лишь добавить еще одного Конкретного Строителя.

Для чего нужен Директор? Опишем это на примере. Пусть подрядчик (Строитель) строит дом. Подрядчик знает, как нужно делать фундамент, возводить стены, делать стропила и класть крышу. Директор (распорядитель) говорит подрядчику, в какой последовательности это делать: сначала нужно заложить фундамент, затем стены, а после этого сделать крышу. В коде это будет выглядеть так:

public class HouseBuilder {
protected House house;
 
public House getHouse() {
return house;
}
 
public void createHouse() {
house = new House();
}
 
public abstract void buildFoundation();
public abstract void buildWalls();
public abstract void buildRoof();
}
 
public class Director {
public House constructHouse(HouseBuilder builder) {
builder.createHouse();
builder.buildFoundation();
builder.buildWalls();
builder.buildRoof();
return builder.getHouse();
}
}


Однако, если Директор плохой, то он может перепутать что-нибудь, и потребовать от Строителя сначала сделать крышу и стены, а потом возвести фундамент. В таком случае для Строителя будет безопаснее самому управлять ходом строительства, а для Директора оставить лишь одну функцию - пусть он командует, что надо построить дом. А Строитель уже сам сделает все, что надо в нужной последовательности. Код этого будет следующий:

public class HouseBuilder {
protected House house;
 
public House getHouse() {
return house;
}
 
public void createHouse() {
house = new House();
buildFoundation();
buildWalls();
buildRoof();
}
 
protected abstract void buildFoundation();
protected abstract void buildWalls();
protected abstract void buildRoof();
}
 
public class Director {
public House constructHouse(HouseBuilder builder) {
builder.createHouse();
return builder.getHouse();
}
}


В заключении можно добавить, что Строитель часто используется вместе с паттерном Компоновщик (Composite).

Комментариев нет:

Отправить комментарий

Постоянные читатели