Рубрики
Без рубрики

Введение в шаблоны креационного дизайна

Введение в четыре основных шаблона креационного дизайна: Singleton, Factory Method, Abstract Factory и Builder.

Автор оригинала: baeldung.

Введение в шаблоны креационного дизайна

1. Введение

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

Дизайн шаблоны приобрел популярность после того, как книга Шаблоны проектирования: Элементы многоразового объектно-ориентированного программного обеспечения был опубликован в 1994 году Эрих гамма, Джон Vlissides, Ральф Джонсон, и Ричард Хелм (также известный как банда четырех или GoF).

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

2. Шаблоны креационного дизайна

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

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

Шаблоны креационного проектирования решает эту проблему, полностью отмеская клиента от фактического процесса инициализации.

В этой статье мы обсудим четыре типа шаблона креационного проектирования:

  1. Singleton — гарантирует, что в приложении существует не более одного экземпляра объекта
  2. Метод фабрики – Создает объекты нескольких смежных классов без указания точного объекта, который будет создан
  3. Абстрактная фабрика – Создает семьи связанных зависимых объектов
  4. Строитель Строит сложные объекты с помощью пошагового подхода

Давайте подробно рассмотрим каждый из этих шаблонов.

3. Синглтон Дизайн шаблон

Шаблон singleton Design направлен на проверку инициализации объектов определенного класса с помощью обеспечение того, чтобы только один экземпляр объекта существовал во всей виртуальной машине Java.

Класс Singleton также предоставляет одну уникальную глобальную точку доступа к объекту, так что каждый последующий вызов в точку доступа возвращает только этот конкретный объект.

3.1. Пример синглтонной модели

Хотя шаблон Singleton был введен GoF, исходная реализация, как известно, проблематична в многопрочитанных сценариях.

Итак, мы будем следовать более оптимальному подходу, который использует статический внутренний класс:

public class Singleton  {    
    private Singleton() {}
    
    private static class SingletonHolder {    
        public static final Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {    
        return SingletonHolder.instance;    
    }
}

Здесь мы создали статические внутренний класс, который держит экземпляр Синглтон класс. Он создает экземпляр только тогда, когда кто-то звонит getInstance() метод, а не когда внешний класс загружается.

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

Также обратите внимание, что конструктор имеет частные модификатор доступа. Это требование для создания Singleton с момента общественные конструктор будет означать, что любой человек может получить к нему доступ и начать создавать новые экземпляры.

Помните, что это не оригинальная реализация GoF. Для оригинальной версии, пожалуйста, посетите эту связанную статью Baeldung о Singletons на Java.

3.2. Когда использовать шаблон дизайна Singleton

  • Для ресурсов, которые являются дорогостоящими для создания (например, объекты подключения базы данных)
  • Это хорошая практика, чтобы сохранить все лесозаготовители, как Singletons, что повышает производительность
  • Классы, которые обеспечивают доступ к настройкам конфигурации приложения
  • Классы, содержащие ресурсы, доступные в общем режиме

4. Шаблон проектирования заводских методов

Шаблон проектирования фабрики или шаблон проектирования заводских методов является одним из наиболее часто используемых шаблонов проектирования в Java.

По данным GoF, эта модель “определяет интерфейс для создания объекта, но позволяет подклассам решать, какой класс Метод Factory позволяет классу отложить мгновение до подклассов».

Этот шаблон делегирует ответственность за инициализацию класса от клиента к определенному заводу класса путем создания типа виртуального конструктора.

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

4.1. Пример шаблона проектирования заводских методов

В этом примере мы создадим Полигон интерфейс, который будет реализован несколькими конкретными классами. ПолигонФактория будет использоваться для извлечения объектов из этого семьи:

Давайте сначала создадим Полигон интерфейс:

public interface Polygon {
    String getType();
}

Далее мы создадим несколько реализаций, таких как Квадратные , Треугольник, и т.д., которые реализуют этот интерфейс и возвращают объект Полигон тип.

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

public class PolygonFactory {
    public Polygon getPolygon(int numberOfSides) {
        if(numberOfSides == 3) {
            return new Triangle();
        }
        if(numberOfSides == 4) {
            return new Square();
        }
        if(numberOfSides == 5) {
            return new Pentagon();
        }
        if(numberOfSides == 7) {
            return new Heptagon();
        }
        else if(numberOfSides == 8) {
            return new Octagon();
        }
        return null;
    }
}

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

4.2. Когда использовать шаблон проектирования заводского метода

  • Когда ожидается, что реализация интерфейса или абстрактного класса будет часто меняться
  • Когда текущая реализация не может удобно разместить новые изменения
  • Когда процесс инициализации относительно прост, и конструктор требует лишь нескольких параметров

5. Абстрактный шаблон дизайна фабрики

В предыдущем разделе мы видели, как шаблон проектирования Factory Method может использоваться для создания объектов, связанных с одним семейством.

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

Для получения подробных объяснений, проверить наш абстрактный учебник завода.

6. Шаблон проектирования строителя

Шаблон Builder Design является еще одним креационным шаблоном, предназначенным для работы со строительством сравнительно сложных объектов.

Когда сложность создания объекта возрастает, шаблон Builder может отделить процесс мгновенности, используя другой объект (строитель) для построения объекта.

Этот строитель может быть использован для создания многих других подобных представлений с помощью простого пошагового подхода.

6.1. Пример шаблона строителя

Оригинальный шаблон Builder Design, представленный GoF, фокусируется на абстракции и очень хорош при работе со сложными объектами, однако, дизайн немного сложнее.

Джошуа Блох (Joshua Bloch) в своей книге Effective Java представил улучшенную версию шаблона строителя, которая является чистой, высокочитаемой (потому что она использует свободного дизайна ) и проста в использовании с точки зрения клиента. В этом примере мы обсудим эту версию.

Этот пример имеет только один класс, БанкКонт который содержит строитель в качестве статические внутренний класс:

public class BankAccount {
    
    private String name;
    private String accountNumber;
    private String email;
    private boolean newsletter;

    // constructors/getters
    
    public static class BankAccountBuilder {
        // builder code
    }
}

Обратите внимание, что все модификаторы доступа на полях объявлены частные так как мы не хотим, чтобы внешние объекты имели к ним доступ напрямую.

Конструктор также частные так что только Строитель, назначенный этому классу, может получить к нему доступ. Все свойства, установленные в конструкторе, извлекаются из объекта-строителя, который мы поставляем в качестве аргумента.

Мы определили BankAccountBuilder в статические внутренний класс:

public static class BankAccountBuilder {
    
    private String name;
    private String accountNumber;
    private String email;
    private boolean newsletter;
    
    public BankAccountBuilder(String name, String accountNumber) {
        this.name = name;
        this.accountNumber = accountNumber;
    }

    public BankAccountBuilder withEmail(String email) {
        this.email = email;
        return this;
    }

    public BankAccountBuilder wantNewsletter(boolean newsletter) {
        this.newsletter = newsletter;
        return this;
    }
    
    public BankAccount build() {
        return new BankAccount(this);
    }
}

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

Эта реализация также поддерживает беглый подход к проектированию, если методы сеттера возвращают объект-строитель.

Наконец, метод сборки называет частного конструктора внешнего класса и передает себя в качестве аргумента. Возвращенный БанкКонт будут мгновенно святься с параметрами, BankAccountBuilder .

Давайте посмотрим быстрый пример шаблона строителя в действии:

BankAccount newAccount = new BankAccount
  .BankAccountBuilder("Jon", "22738022275")
  .withEmail("[email protected]")
  .wantNewsletter(true)
  .build();

6.2. Когда использовать шаблон строителя

  1. Когда процесс создания объекта чрезвычайно сложен, с большим количеством обязательных и необязательных параметров
  2. Когда увеличение числа параметров конструктора приводит к большому списку конструкторов
  3. Когда клиент ожидает различные представления для построенного объекта

7. Заключение

В этой статье мы узнали о шаблонах креационного проектирования на Java. Мы также обсудили их четыре различных типа, т.е. Singleton, Factory Method, Abstract Factory и Builder Pattern, их преимущества, примеры и когда мы должны их использовать.

Как всегда, полные фрагменты кода доступны на GitHub .