Шаблоны проектирования — простой заводской шаблон

задняя часть Шаблоны проектирования продукт

Простой фабричный шаблон — это не строго шаблон проектирования, а скорее привычка программирования.

определение

Простой заводской шаблон (Simple Factory Pattern): также известный как метод статической фабрики (Static Factory Method), который является режимом создания класса. В простом фабричном шаблоне экземпляры разных классов могут быть возвращены в зависимости от параметров. Простой фабричный шаблон специально определяет класс, ответственный за создание экземпляров других классов, и созданные экземпляры обычно имеют общий родительский класс.

структура

简单工厂

Простая фабрика содержит следующие роли:

  • Фабрика: Фабричная рольОтвечает за создание разных экземпляров на основе разных параметров.

  • IProduct: абстрактный образ продуктаИнтерфейс для всех экземпляров продукта, отвечающий за описание поведения всех экземпляров продукта.

  • Продукт (A B ..): конкретный образ продуктаЭкземпляры всех продуктов, код, реализующий абстрактное определение продукта

Пример сценария:

Сцена простого фабричного приложения относительно правильная, тогда по пониманию автора возьмем в качестве примера требования к сцене, встречающиеся в работе автора: Платформа ведет бизнес по покупке авиабилетов и связывает двух поставщиков A и B. После того, как пользователь выбирает авиабилет, платформа берет авиабилет и отправляется к поставщику для размещения заказа. При размещении заказа перейдите к соответствующему поставщику, чтобы разместить заказ в соответствии с авиабилетом, предоставленным поставщиком.

Первым шагом является определение интерфейса заказа.

public interface IVender {
    /**
     * 供应商下单方法
     */
    void order();
}

Затем реализуйте методы заказа поставщиков A и B соответственно.

public class VendorA implements IVender {
    @Override
    public void order() {
        // 业务逻辑处理
        System.out.println("A供应商下单成功,下单时间" + new Date());
    }
}
public class VendorB implements IVender {
    @Override
    public void order() {
        // 业务逻辑处理
        System.out.println("B供应商下单成功,下单时间:" + new Date());
    }
}

Затем определите фабричный класс для создания разных экземпляров поставщиков и возврата их в соответствии с переданными запросами различных параметров. Если встречается недопустимый параметр, будет выдано исключение.

public class VendorFactory {

    public static IVender createVendor(String type) {
        switch (type) {
            case "A":
                return new VendorA();
            case "B":
                return new VendorB();
            default:
                throw new RuntimeException("供应商不存在");
        }
    }
}

Наконец, он вызывается нашим клиентом:

public class Client {
    public static void main(String[] args) {
        String type = "A";
        IVender iVender = VendorFactory.createVendor(type);
        iVender.order();
    }
}

Если мы все напишем в одном классе:

public class Client2 {
    private static final String TYPE_A = "A";
    private static final String TYPE_B = "B";

    public static void main(String[] args) {
        String type = "A";
        if (Objects.equals(TYPE_A, type)) {
            // A 供应商下单逻辑处理
            System.out.println("A供应商下单成功,下单时间" + new Date());
        } else if (Objects.equals(TYPE_B, type)) {
            // B 供应商下单逻辑处理
            System.out.println("A供应商下单成功,下单时间" + new Date());
        } else {
            throw new RuntimeException("供应商不存在");
        }
    }
}

Второй способ написания, если у поставщика больше логики заказа, это сделает клиента очень сложным, и поддерживать его позже будет катастрофой. При добавлении нового поставщика в этот класс вносятся серьезные изменения, что явно нарушает开闭原则и迪米特法则.

преимущество

  • Фабричный класс содержит необходимую логику оценки, которая может решить, когда создавать экземпляр того или иного класса продукта, а клиент может быть освобожден от ответственности за непосредственное создание объекта продукта, но только «потребляет» продукт; простой шаблон фабрики реализует ответственность за продукт за счет такого подхода.Разделение, которое предоставляет специализированные фабричные классы для создания объектов.
  • Клиенту не нужно знать имя класса созданного конкретного класса продукта, а нужно знать только параметры, соответствующие конкретному классу продукта.Для некоторых сложных имен классов простой заводской режим может уменьшить объем памяти пользователя.
  • Внедряя файлы конфигурации, новые определенные категории продуктов могут быть заменены и добавлены без изменения какого-либо клиентского кода, что в определенной степени повышает гибкость системы.

недостаток

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

сцены, которые будут использоваться

Шаблон Simple Factory можно использовать в следующих ситуациях:

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

Суммировать

  • Шаблон создания абстрагирует процесс создания экземпляра класса и может отделить создание объектов от использования объектов.
  • Простой фабричный шаблон, также известный как статический фабричный метод, относится к шаблону создания класса. В простом фабричном шаблоне экземпляры разных классов могут быть возвращены в зависимости от параметров. Простой фабричный шаблон специально определяет класс, ответственный за создание экземпляров других классов, и созданные экземпляры обычно имеют общий родительский класс.
  • Простой шаблон factory состоит из трех ролей: роль factory отвечает за реализацию внутренней логики создания всех экземпляров; роль абстрактного продукта является родительским классом всех создаваемых объектов и отвечает за описание общего интерфейса, общего для всех экземпляров; конкретная роль продукта является целью создания, все созданные объекты действуют как экземпляры конкретного класса в этой роли.
  • Смысл простого фабричного шаблона в том, что когда вам что-то нужно, вам нужно только передать правильный параметр, и вы можете получить нужный вам объект, не зная деталей его создания.
  • Самым большим преимуществом простого фабричного шаблона является то, что он реализует разделение создания объектов и использования объектов, а создание объектов назначается специальному фабричному классу, но его самый большой недостаток в том, что фабричный класс недостаточно гибок, и добавление новых конкретные продукты должны изменить класс фабрики.Код логики суждения, и когда есть много продуктов, код метода фабрики будет очень сложным.
  • Применение простого фабричного шаблона включает в себя: фабричный класс отвечает за создание меньшего количества объектов; клиент знает только параметры, переданные в фабричный класс, и ему все равно, как создать объект.