Nel mio progetto attuale, trovo le mie fabbriche che fanno auto, ma per due motivi ben distinti:
Motivo n. 1 : per aiutare il mio contenitore IoC se una determinata classe ha bisogno di un parametro noto solo quando viene creata la classe. Ciò potrebbe includere anche la lettura di dati da una configurazione. Questo tipo di fabbrica non contiene logica aziendale, solo logica di inizializzazione.
Motivo n. 2 : la creazione di un'entità richiede una logica di convalida complessa e voglio mantenere questa logica fuori dal mio costruttore in modo che rimanga semplice. Questo tipo di fabbrica riguarda solo la logica aziendale attorno alla creazione di una nuova entità.
Inoltre, quando creo una fabbrica per il motivo n. 2, mi ritrovo tentato di mettere anche la logica di cancellazione, poiché la cancellazione dell'entità è spesso complessa e va oltre lo scopo dell'entità che viene cancellata; tuttavia, sarebbe difficile chiamare una classe con un metodo di eliminazione di fabbrica.
Motivo n. 1 Esempio:
class WidgetRepositoryFactory
{
IUserRepository Create(userType)
{
int configValue = int.Parse(Config.get("ConfigValue"));
IUserRepository repo = userType == "user1" : new User1Repo(configValue) : new User2Repo(configValue);
return repo;
}
}
Motivo n. 2 Esempio:
class WidgetFactory
{
Result<Widget> Create(var1, var2)
{
Result r = new Result();
if (var1 < 0)
{
r.AddError("var1 too low!");
return r;
}
if (var1 > var2)
{
r.AddError("var1 too high!");
return r;
}
r.Obj = new Widget(var1, var2);
r.Success = true;
return r;
}
}
Quando creo una fabbrica per la ragione # 2, è davvero corretto chiamarla fabbrica? C'è un termine migliore per questo tipo di lezione? Esiste una terminologia preesistente per descrivere questi due casi ben distinti?