Простой фабричный шаблон — это не строго шаблон проектирования, а скорее привычка программирования.
определение
Простой заводской шаблон (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 отвечает за реализацию внутренней логики создания всех экземпляров; роль абстрактного продукта является родительским классом всех создаваемых объектов и отвечает за описание общего интерфейса, общего для всех экземпляров; конкретная роль продукта является целью создания, все созданные объекты действуют как экземпляры конкретного класса в этой роли.
- Смысл простого фабричного шаблона в том, что когда вам что-то нужно, вам нужно только передать правильный параметр, и вы можете получить нужный вам объект, не зная деталей его создания.
- Самым большим преимуществом простого фабричного шаблона является то, что он реализует разделение создания объектов и использования объектов, а создание объектов назначается специальному фабричному классу, но его самый большой недостаток в том, что фабричный класс недостаточно гибок, и добавление новых конкретные продукты должны изменить класс фабрики.Код логики суждения, и когда есть много продуктов, код метода фабрики будет очень сложным.
- Применение простого фабричного шаблона включает в себя: фабричный класс отвечает за создание меньшего количества объектов; клиент знает только параметры, переданные в фабричный класс, и ему все равно, как создать объект.