Sto implementando una fabbrica come questa:
public interface IMyProduct
{
void DoSomething();
}
public interface IMyFactory
{
IMyProduct CreateMyProduct( string aParameter );
}
internal MyFactory : IMyFactory
{
public MyFactory( ISomeService someService )
{
_someService = someService;
}
public IMyProduct CreateMyProduct( string aParameter )
{
return new MyProduct( _someService, aParameter );
}
private readonly ISomeService _someService;
private class MyProduct : IMyProduct
{
public MyProduct( ISomeService someService, string aParameter )
{
// use the service and the parameter for something...
}
void IMyProduct.DoSomething()
{
// whatever...
}
}
}
Cioè, ho implementato il prodotto all'interno dell'implementazione della fabbrica.
L'idea alla base di questo è che MyProduct
è riferito solo all'interfaccia IMyProduct
(perché l'interfaccia di fabbrica espone solo l'interfaccia del prodotto), quindi non ha bisogno di essere internal
o anche public
.
Certo, la fabbrica diventa più complicata, ma senza la classe del prodotto annidata, è fondamentalmente banale. La mia fabbrica è come un'implementazione complicata del costruttore per il prodotto, tutto è interessante nel prodotto (anche il nome del file potrebbe essere MyProduct.cs
).
Ora la domanda: qual è il trucco? Non ho mai visto una fabbrica astratta implementata in questo modo, e mi sto chiedendo quale sia il problema o il rischio che mi sto perdendo qui.
Modifica
Io pongo la domanda in modo diverso: perché i prodotti delle fabbriche apparentemente non sono mai implementati come classi private? e qual è il vantaggio di rendere l'implementazione del prodotto di una fabbrica accessibile a chiunque oltre a la fabbrica stessa?