Skip to content

Cum Să Implementezi Factory Pattern — Factory Method și Abstract Factory

DodaTech Updated 2025-01-15 2 min read

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

  1. Factory prea complexă cu prea multă logică condițională
  2. Amestecarea Factory Method cu Abstract Factory fără să înțelegi diferența
  3. Fabrici statice care nu pot fi extinse fără modificare
  4. Crearea de fabrici pentru clase care nu au nevoie de abstractizare
  5. Factory care returnează tipuri greșite (cast unsafe)

Întrebări Frecvente

### Care e diferența dintre Factory Method și Abstract Factory?

Factory Method creează un singur tip de obiect printr-o metodă, în timp ce Abstract Factory creează familii întregi de obiecte corelate.

Când ar trebui să folosesc Factory pattern?

Când crearea obiectelor este complexă, când tipul obiectului este determinat la runtime sau când vrei să separi logica de creare de logica de business.

Factory pattern înlocuiește constructorul?

Nu, Factory pattern este o abstractizare peste constructori. Constructorii rămân pentru cazurile simple, Factory pentru cazurile complexe.

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