Статьи

Шаблон проектирования Builder на Java

Шаблон проектирования Builder в Java — это шаблон создания, т. Е. Используемый для создания объектов, аналогичный шаблону проектирования фабричного метода, который также является шаблоном создания проекта. Прежде чем изучать какой-либо шаблон проектирования, предлагаю выяснить проблему, которую решает конкретный шаблон проектирования. Это было хорошо сказано, что необходимость в изобретении матери . Изучение шаблона проектирования без проблем не так эффективно. Вместо этого, если вы уже столкнулись с проблемами, гораздо проще понять шаблон проектирования и узнать, как его решить. В этом руководстве по шаблонам проектирования Java сначала мы увидим, какую проблему решает шаблон проектирования Builder, что даст некоторое представление о том, когда использовать шаблон проектирования Builder в Java, что также является популярным вопросом для интервью с шаблоном проектирования, а затем мы увидим пример шаблона проектирования Builder. и плюсы и минусы использования шаблона Builder в Java.

Какую проблему решает шаблон 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 .