Ce este
Șablonul Metoda fabrică (Factory Method) ascunde crearea unui obiect în spatele unei funcții. Apelantul spune ce vrea — fabrica decide ce clasă concretă să construiască și o returnează.
Apelantul nu atinge niciodată clasele concrete, așa că se pot adăuga tipuri noi fără a schimba codul care apelează. În Python, aceasta este pur și simplu o funcție new_something() al cărei tip returnat este un protocol.
Exemplu: o fabrică de stocare
new_storage("disk") și new_storage("memory") returnează clase concrete diferite în spatele aceluiași protocol Storage — apelantul nu poate face diferența și nici nu are nevoie.
Fabrica alege clasa
Instrucțiunea match după tipuri se află într-un singur loc — fabrica. Restul programului cunoaște doar protocolul.
Ieșire: program Python complet
from typing import Protocol
class Storage(Protocol):
def save(self, data: str) -> str: ...
class DiskStore:
def save(self, data: str) -> str:
return "disc: salvat " + data
class MemoryStore:
def save(self, data: str) -> str:
return "memorie: păstrat " + data
# Fabrica decide ce clasă concretă să construiască.
def new_storage(kind: str) -> Storage:
match kind:
case "memory":
return MemoryStore()
case _:
return DiskStore()
for kind in ["disk", "memory"]:
s = new_storage(kind)
print(s.save("order #1042"))
Când să-l folosești
Folosește-l când clasa concretă depinde de ceva cunoscut doar în timpul rulării — o valoare de configurare, o alegere a utilizatorului, un mediu — sau când vrei ca logica de creare să fie într-un singur loc.
Renunță la el când există o singură implementare și niciun semn al unei a doua. store = DiskStore() nu are nevoie de fabrică.
Avantaje și dezavantaje
Avantaje: logica de creare este într-un singur loc; apelanții depind doar de protocol; adăugarea unui tip nou modifică doar fabrica.
Dezavantaje: încă un nivel prin care trebuie să citești; cu o singură implementare este doar o formalitate.