Ce este
Șablonul Metoda fabrică ascunde crearea unui obiect în spatele unei funcții. Apelantul spune ce vrea — fabrica decide care clasă concretă se construiește și o returnează ca interfață.
Apelantul nu atinge niciodată clasele concrete, așa că se pot adăuga tipuri noi fără a modifica vreun cod apelant. În PHP aceasta este pur și simplu o funcție newSomething() — sau o metodă statică a unei clase — care returnează o interfață.
Exemplu: o fabrică de stocare
newStorage("disk") și newStorage("memory") returnează clase concrete diferite în spatele aceleiași interfețe Storage — apelantul nu poate deosebi diferența și nici nu are nevoie.
Fabrica alege clasa
Instrucțiunea match peste tipuri există într-un singur loc — fabrica. Restul programului cunoaște doar interfața.
Ieșire: script PHP
<?php
interface Storage {
public function save(string $data): string;
}
class DiskStore implements Storage {
public function save(string $data): string {
return "disk: salvat " . $data;
}
}
class MemoryStore implements Storage {
public function save(string $data): string {
return "memory: păstrat " . $data;
}
}
// Fabrica decide ce clasă concretă să construiască.
function newStorage(string $kind): Storage {
return match ($kind) {
"memory" => new MemoryStore(),
default => new DiskStore(),
};
}
foreach (["disk", "memory"] as $kind) {
$s = newStorage($kind);
echo $s->save("order #1042"), "\n";
}
Când să o folosești
Folosește-o atunci când clasa concretă depinde de ceva cunoscut doar la execuție — o valoare de configurare, o alegere a utilizatorului, un mediu — sau când vrei logica de creare exact într-un singur loc.
Renunță la ea când există o singură implementare și nici un semn al unei a doua. $store = new DiskStore() nu are nevoie de fabrică.
Avantaje și dezavantaje
Avantaje: logica de creare într-un singur loc; apelanții depind doar de interfață; adăugarea unui tip atinge doar fabrica.
Dezavantaje: încă un nivel prin care trebuie să citești; cu o singură implementare este pur ceremonial.