Узоры означают «модель или дизайн, используемые в качестве руководства в рукоделии и других ремеслах».

Почему программисты используют шаблоны? Зачем мне нужно использовать? Они выглядят сложными. Могу ли я кодировать без использования каких-либо шаблонов?

Мммм можно. Но вам захочется использовать эти шаблоны, когда вы станете инженером-программистом, поскольку они помогут вам в разработке и поддержании чистоты вашего кода, а также иногда не позволят вам изобретать велосипед.

Некоторые хорошие люди подумали обо всех хороших способах решения проблем и создали разные шаблоны. Таким образом, они могут быть использованы другими людьми.

Хватит о шаблонах в целом. Давайте перейдем к первому шаблону, о котором мы будем говорить сегодня.

Шаблон строителя

У меня есть класс Person, который имеет 2 атрибута

class Person { 
  String firstName; 
  String lastName; 
  public Person (String lastName, String firstName) { 
   this.lastName = lastName; 
   this.firstName = firstName; 
  }
}

Теперь я хочу создать объект

Person person = new Person("Mike", "Jacobson");

Упс, фамилия должна была идти первой. Данг.

И проблема тем больше, чем больше аргументов принимает конструктор. Представить

public Person(String firstName, String lastName, String title, String location, String foo, String bar, int age, int salary, int something, String blah);

Чтобы помочь нам создать объект легко и интуитивно, на помощь приходит шаблон Builder.

class Person {
Имя строки;

инт возраст;

Струнный город;

@Переопределить общедоступную строку toString() {

return Person{ + name=' + name + '\'' + , age= + age + , city=' + city + '\'' + '}';

}

}

Давайте создадим для этого более интуитивно понятный конструктор.

class PersonBuilder { 
  Person person = new Person(); 
  //every time a builder is created 
  //create a Person immediately and return this in build() method 
            
  public void withName(String name) { 
     person.name = name; 
  } 
  public void withAge(int age) { 
     person.age = age; 
  } 
  public void livesIn(String city) { 
    person.city = city; 
  } 
  public Person build() { 
    return person; } 
  }

И продемонстрируйте это, используя:

public class PersonBuilderDemo1 { 
  public static void main(String[] args) { 
    PersonBuilder personBuilder = new PersonBuilder();     
    personBuilder.withName("Mike"); 
    personBuilder.withAge(25); 
    personBuilder.livesIn("New York"); 
    Person person = personBuilder.build();//build returns person 
    
   System.out.println(person); 
  } 
}

И вывод при запуске демонстрационного класса:

Person{name='Mike', age=25, city='New York'}

Выглядит так классно и легко.

Но это можно улучшить.

Как насчет того, чтобы вместо следующих отдельных строк,

PersonBuilder personBuilder = new PersonBuilder(); personBuilder.withName("Mike"); 
personBuilder.withAge(25); 
personBuilder.livesIn("New York"); 
Person person = personBuilder.build();

мы могли бы сделать его немного более плавным и даже более интуитивным:

Person person = new PersonBuilder() 
                 .withName("Mike") 
                 .withAge(25) 
                 .livesIn("New York") 
                 .build();

Ничего себе, это выглядит довольно гладко. Давайте изменим наш билдер, чтобы приведенные выше строки скомпилировались:

class PersonBuilder { 
  Person person = new Person(); 
  public PersonBuilder withName(String name) { //return type changed 
    person.name = name; return this; //return this.. 
    //so the other methods can be chained 
  } 
  public PersonBuilder withAge(int age) { 
    person.age = age; return this; 
  } 
  public PersonBuilder livesIn(String city) { 
    person.city = city; return this; 
  } 
  public Person build() { 
    return person; 
  } 
}

Что мы сделали здесь, так это сделали конструктор немного более гладким. Или свободно. На самом деле это называется Fluent Builder.

Нам нужна была цепочка методов. Таким образом, для каждого метода мы изменили возвращаемый тип на PersonBuilder, чтобы следующий метод можно было вызывать для возвращаемого объекта, которым является PersonBuilder.

Итак, если вы начинаете с шаблона Builder, я бы посоветовал попробовать закодировать приведенный выше пример. Можно использовать другой объект, например Employee, а не Person, и создать для него простой построитель, а затем свободный построитель.

И как только вы закончите с этим, мы перейдем к наследованию билдера, т.е. один билдер является дочерним элементом другого билдера и повторно использует его определенные методы, и мы увидим, с какими проблемами мы сталкиваемся и как мы их решаем. Это будет во второй части.

Первоначально опубликовано на http://javaworklife.wordpress.com 24 июня 2019 г.