Ce este
Șablonul Factory Method ascunde crearea unui obiect în spatele unei funcții. Apelantul spune ce vrea — fabrica decide ce tip concret să construiască și îl returnează ca interfață.
Apelantul nu atinge niciodată tipurile concrete, așa că se pot adăuga tipuri noi fără a schimba codul care apelează. În Go aceasta este pur și simplu o funcție NewSomething() care returnează o interfață.
Exemplu: o fabrică de stocare
NewStorage("disk") și NewStorage("memory") returnează tipuri concrete diferite în spatele aceleiași interfețe Storage — apelantul nu poate face diferența și nici nu are nevoie.
Fabrica alege tipul
Instrucțiunea switch peste tipuri se află într-un singur loc — în fabrică. Restul programului cunoaște doar interfața.
Ieșire: program Go și rezultatul capturat
package main
import "fmt"
type Storage interface {
Save(data string) string
}
type DiskStore struct{}
func (DiskStore) Save(d string) string { return "disc: am salvat " + d }
type MemoryStore struct{}
func (MemoryStore) Save(d string) string { return "memorie: am păstrat " + d }
// Fabrica decide ce tip concret să construiască.
func NewStorage(kind string) Storage {
switch kind {
case "memory":
return MemoryStore{}
default:
return DiskStore{}
}
}
func main() {
for _, kind := range []string{"disk", "memory"} {
s := NewStorage(kind)
fmt.Println(s.Save("comanda #1042"))
}
}
Când să îl folosești
Folosește-l când tipul concret depinde de ceva cunoscut abia la rulare — o valoare din configurare, o alegere a utilizatorului, un mediu de execuție — sau când vrei logica de creare într-un singur loc.
Renunță la el când există o singură implementare și niciun semn că ar urma a doua. store := 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 nou atinge doar fabrica.
Dezavantaje: încă un nivel prin care trebuie să citești; cu o singură implementare este doar formalism.