Parece que estoy mentalmente atrapado en un dilema de patrón Flyweight.Flyweight y problema de fábrica con IDisposable
En primer lugar, vamos a decir que tengo un tipo desechable DisposableFiddle
y una fábrica FiddleFactory
:
public interface DisposableFiddle : IDisposable
{
// Implements IDisposable
}
public class FiddleFactory
{
public DisposableFiddle CreateFiddle(SomethingThatDifferentiatesFiddles s)
{
// returns a newly created fiddle.
}
}
Luego, en mi opinión, es bastante claro para el cliente de FiddleFactory
que la fábrica renuncia a la propiedad del violín creado y que es responsabilidad del cliente deshacerse del violín cuando haya terminado con él.
Sin embargo, vamos a su lugar decir que quiero compartir violines entre los clientes mediante el uso de la flyweight:
public class FiddleFactory
{
private Dictionary<SomethingThatDifferentiatesFiddles, DisposableFiddle> fiddles = new ...;
public DisposableFiddle CreateFiddle(SomethingThatDifferentiatesFiddles s)
{
// returns an existing fiddle if a corresponding s is found,
// or a newly created fiddle, after adding it to the dictionary,
// if no corresponding s is found.
}
}
entonces me siento moralmente obligado a hacer la propia fábrica desechable, ya que crea los violines y mantiene las referencias a ellos durante toda su vida. Pero eso causaría problemas a los clientes que asumieron que poseían los violines y, por lo tanto, deberían eliminarlos.
es el problema en realidad que llamo la fábrica FiddleFactory
en lugar de, digamos, FiddlePool
, y el método de la "creación" en lugar de CreateFiddle
GetFiddle
? De esta manera:
public class FiddlePool : IDisposable
{
private Dictionary<SomethingThatDifferentiatesFiddles, DisposableFiddle> fiddles = new ...;
public DisposableFiddle GetFiddle(SomethingThatDifferentiatesFiddles s)
{
// returns an existing fiddle if a corresponding s is found,
// or a newly created fiddle, after adding it to the dictionary,
// if no corresponding s is found.
}
// Implements IDisposable
}
Entonces es más claro para el cliente que no va a poseer el violín vuelto y es la responsabilidad de la piscina para disponer los violines.
¿O esto solo se puede resolver fácilmente documentando?
¿Hay alguna forma de salir del dilema? ¿Hay incluso un dilema? :-)
Gracias, el primero sigue mejor la Ley de Demeter y el segundo se ajusta mejor en mi diseño general. Hmmm ... –
Pondré mis dos centavos por el primer acercamiento. ¡He visto a demasiadas personas tratar de escribir su propio grupo de SqlConnnection! (En realidad no, pero * he * tenido que explicar por qué no es necesario.) –