Шаблони дизайну в Android - Builder

Шаблони дизайну - це багаторазові рішення найбільш часто зустрічаються програмних проблем. Вони можуть пришвидшити процес розробки шляхом надання перевіреного способу вирішення частих питань.

У цій серії статей я хотів би ознайомити найпоширеніші зразки дизайну з прикладами реалізацій Android на практиці.

Вступ

Шаблони дизайну можна розділити на три розділи:

  • Шаблони креативного дизайну пропонують рішення для створення класів, об'єктів (Singleton, Factory, Builder тощо)
  • Шаблони структурного проектування - це розташування класів та об'єктів (наприклад, композит, фасад, адаптер)
  • Шаблони поведінкового дизайну дають нам спосіб спілкування між об'єктами та класами (команда, спостерігач, стратегія тощо)

Будівельник

Шаблон Builder спрощує створення об'єктів дуже чистим і читабельним способом. Це дуже корисно, коли у нас є кілька модельних класів з багатьма параметрами. Деякі з них ми можемо зробити необов’язковими або потрібними, і ми не змушуємо користувача використовувати певне замовлення (як у конструкторі). Використовуючи шаблон Builder, ми отримуємо вишукану ланцюжок методів. Найбільш поширене використання в класі AlertDialog.Builder ():

новий AlertDialog.Builder (це)
        .setTitle ("Шаблони дизайну")
        .setMessage ("Будівельник дивовижний")
        .create ();

Як ми можемо створити клас Builder для власного використання?

Будівельник на практиці

Припустимо, у нас є якийсь клас моделі для користувача:

Користувач громадського класу {
    приватне рядок firstName;
    приватне String lastName;
    приватний інт вік;
}

І замість того, щоб створювати об’єкти цього класу за допомогою конструкторів, ми хочемо створити їх, використовуючи зразок Builder таким чином:

новий User.Builder ()
        .setFirstName ("Леонардо")
        .setLastName ("да Вінчі")
        .setAge (67)
        .create ();

Як ми можемо це зробити? По-перше, нам потрібно створити клас Builder всередині класу User, який матиме методи побудови нашого об'єкта. Ключовим методом ланцюгових методів є те, що методи будівельника повертають клас Builder. Подивіться на приклад:

статичний клас Builder {
    приватне рядок firstName;
    приватне String lastName;
    приватний інт вік;

    public Builder setFirstName (остання ім'я String firstName) {
        this.firstName = firstName;
        повернути це;
    }

    public Builder setLastName (остаточне прізвище String) {
        this.lastName = lastName;
        повернути це;
    }

    public Builder setAge (остаточний вік) {
        this.age = вік;
        повернути це;
    }

    публічний користувач create () {
        повернути нового Користувача (це);
    }
}

Для кожного параметра у нас є сетер - різниця полягає в тому, що ці методи повертають тип Builder. В кінці у нас є метод, який використовує конструктор з класу User і повертає об’єкт User - тут знаходиться місце, де наш безлад зберігається прихованим.

Потім нам потрібно створити конструктор з усіма параметрами в модельному класі User:

Користувач громадського класу {
    приватне рядок firstName;
    приватне String lastName;
    приватний інт вік;

    приватний користувач (остаточний будівельник) {
        firstName = builder.firstName;
        lastName = builder.lastName;
        вік = builder.age;
    }
}

Тут важливо те, що конструктор User приватний, тому до нього не можна отримати доступ з іншого класу, і ми повинні використовувати Builder для створення нового об'єкта.

Звичайно, ми можемо внести деякі необхідні параметри (оскільки зараз всі вони не є обов’язковими), змінивши наш метод create () та видаливши деякі винятки, наприклад:

публічний користувач create () {
    User user = новий Користувач (firstName, lastName, age);
    якщо (user.firstName.isEmpty ()) {
        кинути нову IllegalStateException (
           "Ім'я не може бути порожнім!");
    }
    повернути користувача;
}

Це воно. Таким чином ми створили наш клас User.Builder ()!

Будівельник - протип

Якщо ви були достатньо терплячими, щоб пройти всю публікацію в блозі, у мене є одна порада щодо схеми Builder: ви можете створити весь клас Builder за допомогою IntelliJ!

Все, що вам потрібно зробити, - це помістити каре на конструктор у вашому класі та вибрати в контекстному меню Refactor -> Замінити конструктор на Builder. Клас Builder з усіма методами буде створений автоматично, готовий до використання.

Більше ви можете прочитати тут: IntelliJ: Замініть конструктор на Builder

Висновок

Шаблон Builder - це чудовий підхід не тільки для класів моделей, але і для кожного об'єкта, який має більше трьох-чотирьох параметрів. Трохи додатково працюючи, ми можемо підвищити читабельність нашого коду. Шаблони дизайну визнані найкращою практикою, тому велика перевага, якщо ви знаєте деякі з них, і Builder - це добре почати.

Слідкуйте за новими!