Wzorzec projektowy— FACTORY

Wzorzec Factory (Fabryka) jest wzorcem projektowym, który dostarcza interfejs do tworzenia obiektów w klasie nadrzędnej, ale pozwala na zmianę typu tworzonego obiektu w klasach pochodnych. Jest to przydatne, gdy chcemy odseparować proces tworzenia obiektu od jego używania.
// Interfejs reprezentujący produkt
interface Product {
void printInfo();
}
// Klasa reprezentująca konkretne produkty
class ConcreteProductA implements Product {
@Override
public void printInfo() {
System.out.println("Product A");
}
}
class ConcreteProductB implements Product {
@Override
public void printInfo() {
System.out.println("Product B");
}
}
// Fabryka abstrakcyjna
interface ProductFactory {
Product createProduct();
}
// Implementacje fabryk produkujących konkretne produkty
class ConcreteProductAFactory implements ProductFactory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
class ConcreteProductBFactory implements ProductFactory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
// Klient korzystający z fabryki
public class Client {
public static void main(String[] args) {
// Utworzenie fabryki dla produktu A
ProductFactory factoryA = new ConcreteProductAFactory();
// Utworzenie produktu A
Product productA = factoryA.createProduct();
// Wywołanie metody na produkcie A
productA.printInfo();
// Utworzenie fabryki dla produktu B
ProductFactory factoryB = new ConcreteProductBFactory();
// Utworzenie produktu B
Product productB = factoryB.createProduct();
// Wywołanie metody na produkcie B
productB.printInfo();
}
}
W tym przykładzie mamy interfejs Product reprezentujący produkty, a następnie dwie konkretne implementacje: ConcreteProductA i ConcreteProductB. Fabryka abstrakcyjna ProductFactory definiuje metodę createProduct(), a dwie konkretne fabryki ConcreteProductAFactory i ConcreteProductBFactory implementują tę metodę, tworząc odpowiednie produkty.
W kliencie (Client) możemy następnie używać różnych fabryk do tworzenia różnych produktów, bez konieczności znać szczegółów implementacji konkretnych produktów. To umożliwia elastyczne zarządzanie rodzajem tworzonych obiektów.