1. Определение и диаграмма моделирования UML

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

2. Сценарии использования:

Несколько компонентов или частей можно собрать в один объект, но получаемые результаты работы одинаковы.

Класс продукта очень сложен, или разные последовательности вызовов в классе продукта дают разные эффекты.

Инициализация объекта особенно сложна, например использование нескольких конструкторов или множества параметров, все со значениями по умолчанию.

3. Основные классы

  • (1) Абстрактный класс продукта: компьютер.
  • (2) Builder: абстрактный Builder, который стандартизирует сборку продукта. Подклассы обычно реализуют конкретный процесс сборки.
  • (3) MacbookBuilder: конкретный класс Builder, класс, который непосредственно создаёт объекты.
  • (4) Directror: унифицирует процесс сборки.

Сосредоточимся на сборке компьютера: главным образом сборка системного блока, установка операционной системы и настройка монитора.

4. Конкретное использование

4.1 Абстрактный класс Computer

Computer.java

public abstract class Computer { protected String mBoard; protected String mDisplay; protected String mOs; protected Computer(){ } public void setBoard(String board){ mBoard=board; } public void setDisplay(String display) { this.mDisplay = display; } public abstract void setOs() ; @Override public String toString() { return "Computer{" + "mBoard='" + mBoard + '\'' + ", mDisplay='" + mDisplay + '\'' + ", mOs='" + mOs + '\'' + '}'; } }

4.2 Конкретный класс продукта MacBook

MacBook.java

public class MacBook extends Computer{ protected MacBook() { } @Override public void setOs() { mOs="Mac OS X 12"; } }

4.3 Абстрактный строитель

Builder.java

public abstract class Builder { abstract void buildBoard(String board); abstract void buildDisplay(String display); abstract void buildOs(); abstract Computer build(); }

4.4 Конкретный строитель

MacBookBuilder.java

public class MacBookBuilder extends Builder { private Computer mComputer=new MacBook(); @Override void buildBoard(String board) { mComputer.setBoard(board); } @Override void buildDisplay(String display) { mComputer.setDisplay(display); } @Override void buildOs() { mComputer.setOs(); } @Override Computer build() { return mComputer; } }

4.5 Класс Director, отвечающий за конкретное построение Computer

Director.java

public class Director { Builder mBuilser=null; public Director(Builder builer) { this.mBuilser = builer; } public void construct(String board,String display){ mBuilser.buildDisplay(display); mBuilser.buildBoard(board); mBuilser.buildOs(); } }

4.6 Конкретное использование

Test.java

public class Test { public static void main(String[] args){ Builder builder=new MacBookBuilder(); Director pcDirector=new Director(builder); pcDirector.construct("Intel Motherboard","Retina Display"); Computer computer = builder.build(); System.out.println(computer.toString()); } }

5. Итоги

Чтобы гибко конструировать сложные объекты, объект будет иметь несколько переменных-членов. При внешнем вызове создавать все переменные-члены сразу не обязательно и неудобно. В этом случае использование нескольких конструкторов для создания объектов затрудняет сопровождение. В этот момент паттерн проектирования Builder решает эту проблему, создавая объекты в методе build() и передавая builder. Builder хранит переменные-члены переданного объекта.

Автор: OneXzgj

Ссылка: https://www.jianshu.com/p/f958ba891467