Абстрактная фабрика: создание гибких систем объектов
Абстрактная фабрика
Абстрактная фабрика - это паттерн проектирования, который позволяет создавать семейства связанных или взаимозависимых объектов без привязки к их конкретным классам. Он является частью группы паттернов Creational (создающих) и служит для создания объектов с определенными свойствами и функциональностью, при этом скрывая детали их создания.
Прежде чем приступить к примерам кода, рассмотрим структуру и работу абстрактной фабрики. Здесь ключевыми компонентами являются абстрактная фабрика, конкретные фабрики и создаваемые продукты.
1. Абстрактная фабрика (Abstract Factory)
Абстрактная фабрика (Abstract Factory) - это интерфейс, определяющий методы создания всех продуктов, образующих семейство.
public interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
2. Конкретные фабрики (Concrete Factories)
Конкретные фабрики (Concrete Factories) - это реализации абстрактной фабрики, которые создают конкретные продукты определенного семейства.
public class ConcreteFactory1 implements AbstractFactory {
public ProductA createProductA() {
return new ConcreteProductA1();
}
public ProductB createProductB() {
return new ConcreteProductB1();
}
}
public class ConcreteFactory2 implements AbstractFactory {
public ProductA createProductA() {
return new ConcreteProductA2();
}
public ProductB createProductB() {
return new ConcreteProductB2();
}
}
3. Продукты (Products)
Продукты (Products) - это абстрактные классы или интерфейсы, определяющие общий интерфейс для всех продуктов, образующих семейство.
public interface ProductA {
void displayInfo();
}
public interface ProductB {
void displayInfo();
}
4. Конкретные продукты (Concrete Products)
Конкретные продукты (Concrete Products) - это реализации продуктов, создаваемых конкретными фабриками.
public class ConcreteProductA1 implements ProductA {
public void displayInfo() {
System.out.println("ConcreteProductA1");
}
}
public class ConcreteProductA2 implements ProductA {
public void displayInfo() {
System.out.println("ConcreteProductA2");
}
}
public class ConcreteProductB1 implements ProductB {
public void displayInfo() {
System.out.println("ConcreteProductB1");
}
}
public class ConcreteProductB2 implements ProductB {
public void displayInfo() {
System.out.println("ConcreteProductB2");
}
}
Для использования абстрактной фабрики, необходимо создать экземпляр нужной конкретной фабрики и использовать ее методы для создания объектов.
public class Client {
private AbstractFactory factory;
public Client(AbstractFactory factory) {
this.factory = factory;
}
public void createAndDisplayProducts() {
ProductA productA = factory.createProductA();
ProductB productB = factory.createProductB();
productA.displayInfo();
productB.displayInfo();
}
}
public class Main {
public static void main(String[] args) {
AbstractFactory factory1 = new ConcreteFactory1();
Client client1 = new Client(factory1);
client1.createAndDisplayProducts();
AbstractFactory factory2 = new ConcreteFactory2();
Client client2 = new Client(factory2);
client2.createAndDisplayProducts();
}
}
В данном примере мы создаем две конкретные фабрики: ConcreteFactory1 и ConcreteFactory2. Клиентский класс Client принимает экземпляр абстрактной фабрики и использует ее методы для создания и отображения продуктов. В Main мы создаем клиентов с разными фабриками и выводим информацию о созданных продуктах.
Таким образом, абстрактная фабрика позволяет упростить создание семейств объектов, обеспечивая гибкость и изолируя клиентский код от деталей создания продуктов. Этот паттерн особенно полезен, когда необходимо создать большое количество взаимосвязанных объектов с одним интерфейсом и вариацией в реализации.