Какую проблему решает шаблон Builder в Java
Как я уже говорил, шаблон Builder — это шаблон творческого проектирования, то есть он решает проблему, связанную с созданием объектов. Конструкторы в Java используются для создания объекта и могут принимать параметры, необходимые для создания объекта. Проблема начинается, когда Объект может быть создан с большим количеством параметров , некоторые из которых могут быть обязательными, а другие могут быть необязательными . Рассмотрим класс, который используется для создания торта, теперь вам нужно количество предметов, таких как яйца, молоко, мука, чтобы создать торт. многие из них являются обязательными, а некоторые необязательными, например, вишня, фрукты и т. д. Если у нас будет перегруженный конструктор для разных видов тортов, то будет много конструкторов, и даже в худшем случае они примут множество параметров.
Проблемы:
1) слишком много конструкторов для обслуживания.
2) подвержены ошибкам, потому что многие поля имеют один и тот же тип, например, сахар и масло находятся в чашках, поэтому вместо 2 чашек сахара, если вы передадите 2 чашки сливочного масла, ваш компилятор не будет жаловаться, но получит сливочный пирог с почти без сахара с высокой стоимостью тратить масло.
Вы можете частично решить эту проблему, создав Cake, а затем добавив ингредиенты, но это создаст еще одну проблему — оставить объект в несогласованном состоянии во время сборки , в идеале торт не должен быть доступен до его создания. Обе эти проблемы могут быть решены с помощью шаблона проектирования Builder в Java . Шаблон проектирования Builder не только улучшает удобочитаемость, но и снижает вероятность ошибки, явно добавляя ингредиенты и делая объект доступным после полной сборки.
Кстати, в Javarevisited уже есть много учебников по шаблонам проектирования, таких как учебник по шаблонам Decorator и шаблон Observer в Java . Если вы еще не читали их, то стоит посмотреть.
Пример шаблона проектирования Builder в Java
Мы будем использовать тот же пример создания Cake с использованием шаблона проектирования Builder на Java. здесь у нас есть статический вложенный класс построителя внутри Cake, который используется для создания объекта.
Руководство по шаблону проектирования Builder на Java
1) Создайте статический вложенный класс с именем Builder внутри класса, объект которого будет построен с помощью Builder. В этом примере это торт.
2) Класс Builder будет иметь точно такой же набор полей, что и исходный класс. 3) Класс Builder предоставит метод для добавления ингредиентов, например sugar () в этом примере. каждый метод будет возвращать один и тот же объект Builder. Builder будет обогащаться при каждом вызове метода.
4) Метод Builder.build () скопирует все значения полей построителя в фактический класс и возвратит объект класса Item.
5) Класс элемента (класс, для которого мы создаем Builder) должен иметь закрытый конструктор для создания своего объекта из метода build () и предотвращения доступа постороннего к его конструктору.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
public class BuilderPatternExample { public static void main(String args[]) { //Creating object using Builder pattern in java Cake whiteCake = new Cake.Builder().sugar(1).butter(0.5). eggs(2).vanila(2).flour(1.5). bakingpowder(0.75).milk(0.5).build(); //Cake is ready to eat 🙂 System.out.println(whiteCake); }}class Cake { private final double sugar; //cup private final double butter; //cup private final int eggs; private final int vanila; //spoon private final double flour; //cup private final double bakingpowder; //spoon private final double milk; //cup private final int cherry; public static class Builder { private double sugar; //cup private double butter; //cup private int eggs; private int vanila; //spoon private double flour; //cup private double bakingpowder; //spoon private double milk; //cup private int cherry; //builder methods for setting property public Builder sugar(double cup){this.sugar = cup; return this; } public Builder butter(double cup){this.butter = cup; return this; } public Builder eggs(int number){this.eggs = number; return this; } public Builder vanila(int spoon){this.vanila = spoon; return this; } public Builder flour(double cup){this.flour = cup; return this; } public Builder bakingpowder(double spoon){this.sugar = spoon; return this; } public Builder milk(double cup){this.milk = cup; return this; } public Builder cherry(int number){this.cherry = number; return this; } //return fully build object public Cake build() { return new Cake(this); } } //private constructor to enforce object creation through builder private Cake(Builder builder) { this.sugar = builder.sugar; this.butter = builder.butter; this.eggs = builder.eggs; this.vanila = builder.vanila; this.flour = builder.flour; this.bakingpowder = builder.bakingpowder; this.milk = builder.milk; this.cherry = builder.cherry; } @Override public String toString() { return "Cake{" + "sugar=" + sugar + ", butter=" + butter + ", eggs=" + eggs + ", vanila=" + vanila + ", flour=" + flour + ", bakingpowder=" + bakingpowder + ", milk=" + milk + ", cherry=" + cherry + '}'; } } |
Выход:
|
1
|
Cake{sugar=0.75, butter=0.5, eggs=2, vanila=2, flour=1.5, bakingpowder=0.0, milk=0.5, cherry=0} |
Шаблон проектирования Builder на Java — за и против
Живой все У шаблона Builder также есть некоторые недостатки, но если вы посмотрите ниже, преимущества явно превосходят количество недостатков шаблона проектирования Builder. В любом случае, здесь есть несколько преимуществ и недостатков шаблона проектирования Builder для создания объектов в Java.
Преимущества:
1) более удобен в обслуживании, если количество полей, необходимых для создания объекта, больше 4 или 5.
2) менее подвержен ошибкам, так как пользователь будет знать, что он передает из-за явного вызова метода.
3) более надежный, поскольку только полностью построенный объект будет доступен для клиента.
Недостатки: 1) подробное и дублирование кода, так как Builder необходимо скопировать все поля из класса Original или Item.
Когда использовать шаблон Builder Design в Java Шаблон Builder Design является творческим шаблоном и должен использоваться, когда число параметров, требуемых в конструкторе, обычно превышает 4 или не превышает 5. Не путайте с шаблоном Builder и Factory, существует очевидный Разница между шаблоном Builder и Factory, поскольку Factory может использоваться для создания различных реализаций одного и того же интерфейса, но Builder связан со своим классом Container и возвращает только объект класса Outer.
Вот и все, что касается шаблона проектирования Builder на Java . мы поняли, зачем нам нужен шаблон Builder, какую проблему он решает, пример шаблона проектирования Builder в Java и, наконец, когда использовать шаблон Builder с преимуществами и недостатками. Так что, если вы не используете шаблон конструктора с телескопической передачей или у вас есть выбор не использовать его, тогда лучше использовать шаблон Builder.
Ссылка: шаблон проектирования Builder на Java — пример учебного курса от нашего партнера по JCG Явина Пола в блоге Javarevisited .