W toku nauki programowania oraz poznawania języka Java, miałem możliwość poznania wzorców projektowych. Sprawne rozwiązania na popularne problemy poprawiają czytelność kodu oraz go strukturyzują, pozwalając programiście nie wymyślać koła na nowo.
Wykorzystując wzorzec projektowy Fabryka, proces tworzenia obiektów i jego organizacji jest usprawniony i usystematyzowany sprawiając, że kod jest bardziej czytelny, a zależności pomiędzy klasami i interfejsami bardziej przejrzyste.
Przedstawione w tym wpisie projektowe rozwiązanie, pozwala na abstrakcyjne tworzenie obiektów, eliminując bezpośrednie uzależnienie klienta od konkretnych klas obiektów. W ten sposób wzorzec Fabryka wspomaga elastyczność systemu, umożliwiając zmiany w hierarchii klas bez konieczności modyfikacji kodu klienta.
Pozostając w industrialnej konwencji tego wzorca, przedstawiam implementację wzorca projektowego Fabryka, w wersji abstrakcyjnej.

Główne elementy wzorca Fabryka:
- Produkt
Produkt to abstrakcja definiująca obiekt, który Fabryka ma utworzyć.
abstract public class MetalWorkingMachine {
private int strokeHeight;
private int strokeForce;
private int safetyDistance;
public MetalWorkingMachine(int strokeHeight, int strokeForce,
int safetyDistance) {
this.strokeHeight = strokeHeight;
this.strokeForce = strokeForce;
this.safetyDistance = safetyDistance;
}
public int getStrokeHeight() {
return strokeHeight;
}
public int getStrokeForce() {
return strokeForce;
}
public int getSafetyDistance() {
return safetyDistance;
}
}
- Konkretny Produkt
Konkretne produkty to klasy dziedziczące po abstrakcyjnym opisie produktu. Są to rzeczywiste obiekty, które zostaną utworzone przez fabrykę.
public class Press extends MetalWorkingMachine {
public Press(int strokeHeight, int strokeForce,
int safetyDistance) {
super(strokeHeight, strokeForce, safetyDistance);
}
}
- Fabryka
Fabryka to abstrakcyjna klasa, która deklaruje metody abstrakcyjne do tworzenia produktów. Istnieje wiele klas fabryk, z których każda implementuje tę metodę, aby utworzyć konkretny produkt.
abstract public class Factory {
abstract public MetalWorkingMachine createMetalWorkingMachine(MachineType machineType);
abstract public PlasticWorkingMachine createPlasticWorkingMachine(MachineType machineType);
}
- Konkretna Fabryka.
Konkretne fabryki to klasy rozszerzające abstrakcyjną klasę Factory. Każda z tych klas jest odpowiedzialna za tworzenie określonych konkretnych produktów.
public class LightIndustryFactory extends Factory{
@Override
public MetalWorkingMachine createMetalWorkingMachine(MachineType machineType) {
switch (machineType) {
case PRESS:
return new Press(750, 100,325);
default:
throw new UnsupportedOperationException("Unknown machine type.");
}
}
@Override
public PlasticWorkingMachine createPlasticWorkingMachine(MachineType machineType) {
switch (machineType) {
case INTRUSION_MACHINE:
return new IntrusionMachine(89, 220, 103);
default:
throw new UnsupportedOperationException("Unknown machine type.");
}
}
}
- Klient
Klient korzysta z zasobów fabryki i produktu, niezależnie od konkretnej klasy produktu czy fabryki. Dzięki temu nie musi znać dokładnej implementacji konkretnych produktów i fabryk.
public static void main(String[] args) {
Factory lightIndustryFactory = new LightIndustryFactory();
Factory heavyIndustryFactory = new HeavyIndustryFactory();
MetalWorkingMachine lightPress = lightIndustryFactory.createMetalWorkingMachine(MachineType.PRESS);
PlasticWorkingMachine heavyIntrusionMachine = heavyIndustryFactory.createPlasticWorkingMachine(MachineType.INTRUSION_MACHINE);
}
Korzyści z zastosowania wzorca Fabryka:
- Elastyczność
Wzorzec Fabryka pozwala na łatwe wprowadzanie zmian w hierarchii klas, co zwiększa elastyczność systemu. - Uniezależnienie klienta
Klient nie musi znać konkretnych klas produktów czy fabryk, co ułatwia utrzymanie i rozwijanie systemu. - Łatwa rozszerzalność
Dodawanie nowych produktów czy fabryk jest stosunkowo proste, bez konieczności zmiany kodu istniejącego klienta. - Zachowanie jednolitego interfejsu
Wzorzec ten promuje korzystanie z jednolitego interfejsu, co ułatwia zrozumienie i utrzymanie kodu.
Podsumowanie:
Wzorzec projektowy Fabryka to potężne narzędzie, które umożliwia efektywne zarządzanie procesem tworzenia obiektów w programowaniu obiektowym. Zapewnia on elastyczność, łatwą rozszerzalność i uniezależnienie klienta od konkretnej implementacji klas, co przyczynia się do tworzenia bardziej modularnego i zrozumiałego kodu. Korzystanie z tego wzorca może znacznie ułatwić projektowanie i utrzymanie tworzonych rozwiązań programistycznych.
