Фабричный шаблон «Шаблон проектирования»

       В объектно-ориентированном программировании наиболее распространенным способом создания экземпляра объекта является создание экземпляра объекта с помощью оператора new. Однако в некоторых случаях возникают некоторые проблемы, когда оператор new непосредственно генерирует объект. Например, создание объекта требует ряда шагов: может потребоваться вычислить или получить начальное положение объекта, выбрать экземпляр подобъекта для генерации или перед генерацией необходимо сгенерировать некоторые вспомогательные объекты. В этих случаях создание нового объекта — это «процесс», а не просто операция, подобная зубчатой ​​передаче в более крупной машине.

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

1. Что такое заводской режим?

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

  • Простой шаблон фабрики (Простая фабрика)
  • Шаблон фабричного метода
  • Паттерн «Абстрактная фабрика» (Абстрактная фабрика)

Эти три режима постепенно становятся более абстрактными и более общими сверху вниз. В книге « Шаблоны проектирования » фабричные паттерны разделены на две категории: паттерн фабричного метода и абстрактный фабричный паттерн. Думайте о простом шаблоне фабрики как о частном случае шаблона фабричного метода, и они относятся к одной и той же категории. Давайте сначала получим предварительное представление о фабричной модели из следующих случаев: 

(1) В эпоху без заводов, если покупателю нужен автомобиль BMW, ему необходимо создать автомобиль BMW, а затем использовать его.

(2) Простая фабричная модель: позже появились фабрики, и пользователям больше не нужно было создавать автомобили BMW. Их создавал завод. Какую бы машину они ни хотели, они могли просто создать ее непосредственно на заводе. Например, если вы хотите машину серии 320i, завод создаст эту серию машин.

(3) Модель фабричного метода: чтобы удовлетворить клиентов, появляется все больше и больше серий автомобилей BMW, таких как 320i, 523i и т. д. Один завод не может создавать все серии BMW, поэтому несколько конкретных заводов разделены, каждый конкретный. Завод создает серия, то есть конкретный заводской класс, может создавать только один конкретный продукт. Но завод БМВ — это пока абстракция, нужно указать конкретный завод по производству автомобилей.

(4) Абстрактная модель завода: поскольку требования клиентов становятся все выше и выше, автомобили BMW должны быть оснащены кондиционерами, поэтому этот завод начал производить автомобили BMW и необходимые кондиционеры. В конце концов, покупателю достаточно сказать продавцу BMW: «Я хочу автомобиль 523i с кондиционером», и продавец напрямую подарит ему автомобиль 523i с кондиционером. Вместо того, чтобы самостоятельно создавать BMW 523i с кондиционером.

Ниже мы предоставим подробное объяснение нескольких различных заводских режимов:

2. Простой заводской режим

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

Если фабрика не используется, пользователь создаст автомобиль BMW самостоятельно.Конкретная UML-схема и код следующие:

public class BMW320 {
	public BMW320(){
		System.out.println("制造-->BMW320");
	}
}
 
public class BMW523 {
	public BMW523(){
		System.out.println("制造-->BMW523");
	}
}
 
public class Customer {
	public static void main(String[] args) {
		BMW320 bmw320 = new BMW320();
		BMW523 bmw523 = new BMW523();
	}
}

Пользователям необходимо знать, как создать автомобиль, чтобы клиент и автомобиль были тесно связаны. Клиент напрямую использует заводской метод. Чтобы создать метод, просто введите желаемую модель BMW, не зная деталей создания.

2.1 UML-диаграмма простого фабричного шаблона

  • Роль фабрики. Ядро этой модели, используемой для создания продуктов, содержит определенную бизнес-логику и логику суждений.
  • Абстрактная роль продукта: обычно это родительский класс, унаследованный конкретным продуктом или реализованным интерфейсом.   
  • Особая роль продукта: объекты, созданные фабричным классом, являются экземплярами этой роли. Реализовано конкретным классом в Java.

2.2 Реализация кода

Категория продукта:

abstract class BMW {
	public BMW(){}
}
 
public class BMW320 extends BMW {
	public BMW320() {
		System.out.println("制造-->BMW320");
	}
}
public class BMW523 extends BMW{
	public BMW523(){
		System.out.println("制造-->BMW523");
	}
}

Заводской класс:

public class Factory {
	public BMW createBMW(int type) {
		switch (type) {
		
		case 320:
			return new BMW320();
 
		case 523:
			return new BMW523();
 
		default:
			break;
		}
		return null;
	}
}

Класс пользователя:

public class Customer {
	public static void main(String[] args) {
		Factory factory = new Factory();
		BMW bmw320 = factory.createBMW(320);
		BMW bmw523 = factory.createBMW(523);
	}
}

2.3.Преимущества и недостатки простой фабричной модели

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

Но недостатком является то, что он не соответствует «принципу открытия и закрытия», а класс фабрики необходимо модифицировать каждый раз при добавлении нового продукта. Когда существует много типов продуктов, логика фабрики может быть слишком сложной, что не способствует расширению и обслуживанию системы. Более того, класс фабрики концентрирует всю логику создания продукта. Если она не работает должным образом, это повлияет на всю систему.

Чтобы решить проблемы простого шаблона фабрики, появился шаблон фабричного метода.

3. Шаблон фабричного метода

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

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

3.1. Структурная диаграмма UML фабричного метода выглядит следующим образом.

Абстрактная фабрика AbstractFactory: Ядром шаблона фабричного метода является интерфейс, который должна реализовать конкретная роль фабрики, или родительский класс, который должен быть унаследован. В Java он реализуется абстрактным классом или интерфейсом. 
Конкретная фабрика Фабрика: объект, вызываемый приложением для создания определенного продукта, содержащий код, связанный с конкретной бизнес-логикой.Абстрактный
продукт: родительский класс, унаследованный конкретным продуктом, или реализованный интерфейс.В Java обычно существуют абстрактные классы или интерфейсы. реализовать. 
Конкретный продукт Продукт: объект, созданный конкретной ролью фабрики, является экземпляром этой роли.

3.2 Реализация кода

Категория продукта:

abstract class BMW {
	public BMW(){}
}
public class BMW320 extends BMW {
	public BMW320() {
		System.out.println("制造-->BMW320");
	}
}
public class BMW523 extends BMW{
	public BMW523(){
		System.out.println("制造-->BMW523");
	}
}

Заводской класс: 

interface FactoryBMW {
	BMW createBMW();
}
 
public class FactoryBMW320 implements FactoryBMW{
 
	@Override
	public BMW320 createBMW() {
		return new BMW320();
	}
 
}
public class FactoryBMW523 implements FactoryBMW {
	@Override
	public BMW523 createBMW() {
		return new BMW523();
	}
}

Класс клиента:

public class Customer {
	public static void main(String[] args) {
		FactoryBMW320 factoryBMW320 = new FactoryBMW320();
		BMW320 bmw320 = factoryBMW320.createBMW();
 
		FactoryBMW523 factoryBMW523 = new FactoryBMW523();
		BMW523 bmw523 = factoryBMW523.createBMW();
	}
}

4. Шаблон «Абстрактная фабрика»

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

Прежде чем представить шаблон абстрактной фабрики, мы сначала проясним две концепции:

  • Структура уровня продукта: Структура уровня продукта относится к структуре наследования продукта. Например, абстрактный класс кондиционера имеет ряд подклассов, таких как кондиционер Haier, кондиционер Gree, кондиционер Midea и т. д. Затем этот кондиционер абстрактный класс и его подклассы составляют создание иерархии продуктов.
  • Семейство продуктов: Семейство продуктов относится к группе продуктов, производимых одним и тем же заводом и находящихся в разных иерархических структурах продуктов. Например, завод Haier производит кондиционеры Haier и холодильники Haier, поэтому кондиционеры Haier относятся к семейству продуктов для кондиционирования воздуха.
     

Схематическая диаграмма структуры уровня продукта и структуры семейства продуктов выглядит следующим образом:

4.1. Что такое шаблон абстрактной фабрики?

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

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

4.2 Структурная диаграмма UML

Абстрактная фабрика AbstractFactory: определяет интерфейс, который содержит набор методов для производства продуктов. Все конкретные фабрики должны реализовать этот интерфейс.
ConcreteFactory: используется для производства различных семейств продуктов. Чтобы создать продукт, пользователю нужно использовать только одну из фабрик для его получения, вообще не создавая экземпляры каких-либо объектов продукта.
Абстрактный продукт: это семейство продуктов, и каждый конкретный завод может производить полный набор продуктов.
Конкретный продуктПродукт

4.3.Реализация кода

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

Другими словами, когда каждый абстрактный продукт имеет более одного конкретного подкласса (у кондиционеров есть две модели A и B, а у двигателей также есть две модели A и B), как роль фабрики узнает, какой подкласс создавать? Шаблон абстрактной фабрики предоставляет две конкретные роли фабрики (фабрика серии BMW 320 и фабрика серии BMW 230), которые соответствуют этим двум конкретным ролям продукта соответственно. Каждая конкретная роль фабрики отвечает только за создание экземпляра определенной роли продукта. Каждая конкретная фабрика Класс отвечает только за создание экземпляров определенного подкласса абстрактного продукта.

Категория продукта:

//发动机以及型号  
public interface Engine {}  
 
public class EngineA implements Engine{  
    public EngineA(){  
        System.out.println("制造-->EngineA");  
    }  
}  
public class EngineB implements Engine{  
    public EngineB(){  
        System.out.println("制造-->EngineB");  
    }  
}  
 
 
//空调以及型号  
public interface Aircondition {} 
 
public class AirconditionA implements Aircondition{  
    public AirconditionA(){  
        System.out.println("制造-->AirconditionA");  
    }  
}  
public class AirconditionB implements Aircondition{  
    public AirconditionB(){  
        System.out.println("制造-->AirconditionB");  
    }  
} 

Создайте фабричный класс:

//创建工厂的接口  
public interface AbstractFactory {  
    //制造发动机
    public Engine createEngine();
    //制造空调 
    public Aircondition createAircondition(); 
}  
 
//为宝马320系列生产配件  
public class FactoryBMW320 implements AbstractFactory{     
    @Override  
    public Engine createEngine() {    
        return new EngineA();  
    }  
    @Override  
    public Aircondition createAircondition() {  
        return new AirconditionA();  
    }  
}  
//宝马523系列
public class FactoryBMW523 implements AbstractFactory {  
     @Override  
    public Engine createEngine() {    
        return new EngineB();  
    }  
    @Override  
    public Aircondition createAircondition() {  
        return new AirconditionB();  
    }  
} 

клиент:

public class Customer {  
    public static void main(String[] args){  
        //生产宝马320系列配件
        FactoryBMW320 factoryBMW320 = new FactoryBMW320();  
        factoryBMW320.createEngine();
        factoryBMW320.createAircondition();
          
        //生产宝马523系列配件  
        FactoryBMW523 factoryBMW523 = new FactoryBMW523();  
        factoryBMW523.createEngine();
        factoryBMW523.createAircondition();
    }  
}

5. Краткое описание заводской модели

Разница между шаблоном фабричного метода и шаблоном абстрактной фабрики заключается в следующем:

(1) Фабричный метод имеет только один абстрактный класс продукта и один абстрактный класс фабрики, но он может создавать несколько конкретных классов продуктов и конкретных классов фабрик. Каждый конкретный класс фабрики может создавать только один экземпляр конкретного класса продукта.

(2) Шаблон абстрактной фабрики имеет несколько абстрактных классов продуктов (семейств продуктов) и абстрактный класс фабрики. Каждый абстрактный класс продукта может быть производным от нескольких конкретных классов продуктов; абстрактный класс фабрики также может производить несколько конкретных классов фабрики. В то же время каждый класс конкретной фабрики может создавать несколько экземпляров классов конкретных продуктов
 

рекомендация

отblog.csdn.net/m0_50370837/article/details/126245282
рекомендация