Ho una certa confusione riguardo a Factory Pattern, ci sono fondamentalmente due modi per implementarli.
Metodo 1:
public interface IProductFactory
{
IProduct GetProductA();
IProduct GetProductB();
IProduct GetProductC();
}
public class ProductFactory : IProductFactory
{
public IProduct GetProductA()
{
//some implementation goes here
}
public IProduct GetProductB()
{
//some implementation goes here
}
public IProduct GetProductC()
{
//some implementation goes here
}
}
Approccio 2:
public enum ProductType
{
ProductA = 1,
ProductB = 2,
ProductC = 3
}
public interface IProductFactory
{
IProduct GetProduct(ProductType productType);
}
public class ProductFactory : IProductFactory
{
public IProduct GetProduct(ProductType productType)
{
switch (productType)
{
case ProductType.ProductA:
//return IProduct with specific implementation
break;
case ProductType.ProductB:
//return IProduct with specific implementation
break;
case ProductType.ProductC:
//return IProduct with specific implementation
break;
default:
//return null
}
}
}
Pro di entrambi gli approcci
Metodo 1:
-
Il vantaggio di
- del tempo di compilazione verifica che la classe di implementazione sarà costretto a fornire i metodi corrispondenti.
Approccio 2:
- L'implementazione avrà il vantaggio di un numero inferiore. di linee di codice.
- L'interfaccia non diventa fragile, non cambierà come nuova i prodotti continuano ad aggiungere.
Contro entrambi gli approcci
Metodo 1:
- Le linee di codice diventano grandi.
- Man mano che viene implementato un numero maggiore di prodotti, l'interfaccia cambia e quindi è difficile seguire il principio di sostituzione di Liskov.
Approccio 2:
- Poiché nasconde i dettagli interni di GetProduct, è difficile dire cosa restituirà la Factory quando è presente un tipo specifico di enum passato.
- Potresti entrare in eccezioni di runtime
Sto ancora lottando per decidere quale approccio usare?
Nota: sono solo consapevole di questi due approcci, potrebbero esserci anche approcci diversi.