Javenue logo

Javenue

Программирование на Java

Информационные технологии

Паттерн Builder на Java - Строитель

Паттерн 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 - на том, как оно создается.



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

  Выйти

  * для публикации комментариев нужно  

gdwz:

Както не доконца ясно, где это мжет понадобиться. Почему бы например не обойтись без класса директор, поместив его метод constructComputer в абстрактный класс ComputerBuilder?

c0nst:

Обрати внимание на этот текст из статьи:

Класс Director делает комплексное построение продукта (в нашем случае компьютера) и не заботится о том, как именно создаются его части.

Может на этом примере будет понятнее: ты строишь дом, у тебя есть бригада строителей разных специализаций (каждая специализация - это метод из класса Builder). Director - это ты :). Что ты скажешь строителям, то они и будут делать. Если скажешь им сначала стены построить, а только потом залить фундамент, то они так и сделают. Но ты, как настоящий Director, знаешь последовательность, в которой строить дом. С другой стороны, тебя не сильно интересует сам процесс, например, возведения стен (кирпичи будут класть слева направо или наоборот).

Raman:

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

Evgenic:

Господа, чувствеется путаница между кислым и мягким. Сложность объектов тут ни при чем, это как частный случай. Тут главное следующий момент. Вот вы написали код креейта некого объекта. Со временем объект поменялся или добавились его вариации. Что, переписывать получение и последующее использование? Используя данный паттерн креейт и юзание объектов будет обно и тоде на все времена, а вам остается тока дописывать вновь требуемые классы. Очень удобно при использовании SpringFrameWork.

Dream Bim:

Говнокод какой то. Автор не совсем понимает данный паттерн.Не самая лучша статья для знакомства стемой. Лучше почитайте более качественныей пример от сюда http://www.javaworld.com/article/2074938/core-java/too-many-parameters-in-java-methods-part-3-builder-pattern.html