Cum Să Implementezi Factory Pattern — Factory Method și Abstract Factory
In this tutorial, you'll learn about Cum Să Implementezi Factory Pattern. We cover key concepts, practical examples, and best practices.
Vei învăța cum să implementezi Factory pattern (Factory Method și Abstract Factory) pentru a crea obiecte flexibil, fără a depinde de clase concrete.
Problema
Când codul tău creează obiecte direct cu new, devine greu de extins și de testat. Fiecare nou tip de obiect necesită modificarea codului existent, încălcând principiul Open/Closed.
Abordarea Greșită
Crearea directă a obiectelor cu switch-case în codul client.
// Greșit: switch-case care trebuie modificat la fiecare tip nou
public Animal getAnimal(String type) {
switch (type) {
case "caine": return new Caine();
case "pisica": return new Pisica();
default: throw new IllegalArgumentException();
}
}
Abordarea Corectă
Folosește Factory Method pentru a delega crearea obiectelor.
// Corect: Factory Method
interface Animal {
void sunet();
}
class Caine implements Animal {
public void sunet() { System.out.println("Ham ham"); }
}
class AnimalFactory {
public static Animal createAnimal(String tip) {
return switch (tip) {
case "caine" -> new Caine();
case "pisica" -> new Pisica();
default -> throw new IllegalArgumentException();
};
}
}
// Cod client
Animal animal = AnimalFactory.createAnimal("caine");
animal.sunet();
Rezolvare Pas cu Pas
1. Definește interfața sau clasa abstractă
from abc import ABC, abstractmethod
class Document(ABC):
@abstractmethod
def export(self) -> str:
pass
2. Creează clasele concrete
class PDFDocument(Document):
def export(self) -> str:
return "Export PDF"
class WordDocument(Document):
def export(self) -> str:
return "Export Word"
3. Implementează Factory Method
class DocumentFactory:
@staticmethod
def create_document(tip: str) -> Document:
fabrici = {
"pdf": PDFDocument,
"word": WordDocument
}
cls = fabrici.get(tip)
if not cls:
raise ValueError(f"Tip necunoscut: {tip}")
return cls()
4. Implementează Abstract Factory (pentru familii de obiecte)
class GUIFactory(ABC):
@abstractmethod
def create_button(self): pass
@abstractmethod
def create_checkbox(self): pass
class WindowsFactory(GUIFactory):
def create_button(self): return WindowsButton()
def create_checkbox(self): return WindowsCheckbox()
class MacFactory(GUIFactory):
def create_button(self): return MacButton()
def create_checkbox(self): return MacCheckbox()
Sfaturi de Prevenție
- Folosește Factory Method când ai un singur tip de produs
- Folosește Abstract Factory când ai familii de produse corelate
- Păstrează fabricile simple — nu adăuga logică de business în fabrici
Greșeli Comune
- Factory prea complexă cu prea multă logică condițională
- Amestecarea Factory Method cu Abstract Factory fără să înțelegi diferența
- Fabrici statice care nu pot fi extinse fără modificare
- Crearea de fabrici pentru clase care nu au nevoie de abstractizare
- Factory care returnează tipuri greșite (cast unsafe)
Întrebări Frecvente
Construit de dezvoltatorii Doda Browser, DodaZIP și Durga Antivirus Pro. Uneltele DodaTech folosesc Factory pattern pentru integrarea cu multiple formate și platforme.
Built by the developers of DodaTech
Doda Browser, DodaZIP & Durga Antivirus Pro