Предоставляет интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов.
- AbstractFactory: объявляет интерфейс для операций, которые создают абстрактные продукты.
- ConcreteFactory: реализует операции по созданию объектов конкретного продукта.
- AbstractProduct: объявляет интерфейс для типа объекта product.
- Продукт: определяет объект продукта, который будет создан соответствующей бетонной фабрикой. Реализует интерфейс AbstractProduct.
- Клиент: использует интерфейсы, объявленные классами AbstractFactory и AbstractProduct.
public class Main {
public static void main(String[] args) {
// Abstract factory #1
AbstractFactory factory1 = new ConcreteFactory1();
Client client1 = new Client(factory1);
client1.run();
// Abstract factory #2
AbstractFactory factory2 = new ConcreteFactory2();
Client client2 = new Client(factory2);
client2.run();
}
}
public interface AbstractFactory {
AbstractProductA createProductA();
AbstractProductB createProductB();
}
public class ConcreteFactory1 implements AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ProductA1();
}
@Override
public AbstractProductB createProductB() {
return new ProductB1();
}
}
public class ConcreteFactory2 implements AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ProductA2();
}
@Override
public AbstractProductB createProductB() {
return new ProductB2();
}
}
public interface AbstractProductA {
}
public interface AbstractProductB {
void interact(AbstractProductA a);
}
public class ProductA1 implements AbstractProductA {
}
public class ProductB1 implements AbstractProductB {
@Override
public void interact(AbstractProductA a) {
System.out.println(this.getClass().getSimpleName() + " interacts with " + a.getClass().getSimpleName());
}
}
public class ProductA2 implements AbstractProductA {
}
public class ProductB2 implements AbstractProductB {
@Override
public void interact(AbstractProductA a) {
System.out.println(this.getClass().getSimpleName() + " interacts with " + a.getClass().getSimpleName());
}
}
public class Client {
private AbstractProductA abstractProductA;
private AbstractProductB abstractProductB;
public Client(AbstractFactory factory) {
abstractProductB = factory.createProductB();
abstractProductA = factory.createProductA();
}
public void run() {
abstractProductB.interact(abstractProductA);
}
}
ProductB1 interacts with ProductA1 ProductB2 interacts with ProductA2
eidherjulian61/дизайн-шаблоны
Основные шаблоны Проектирования
ид – 27 сентября ・ 1 минута чтения
Оригинал: “https://dev.to/eidher/abstract-factory-3opg”