我似乎精神卡在轻量级模式的困境。轻量级和工厂问题与IDisposable
首先,让我们说我有一个一次性的类型DisposableFiddle
和工厂FiddleFactory
:
public interface DisposableFiddle : IDisposable
{
// Implements IDisposable
}
public class FiddleFactory
{
public DisposableFiddle CreateFiddle(SomethingThatDifferentiatesFiddles s)
{
// returns a newly created fiddle.
}
}
然后,在我看来,这是很清楚的FiddleFactory
客户端,该工厂声称没有创建的小提琴的所有权而且在处理小提琴时,客户有责任处理小提琴。
然而,我们不是说我想要通过使用享元模式共享客户端之间小提琴:
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.
}
}
然后,我觉得在道义上有义务使工厂本身一次性的,因为它创建了小提琴,并保持引用给他们一生的一切。但是,如果客户认为他们拥有小提琴,那么这会给客户带来问题,因此应该处理他们。
实际上是问题,我称之为工厂FiddleFactory
而是说:FiddlePool
,并“创造”的方法,而不是CreateFiddle
的GetFiddle
?就像这样:
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
}
然后它更清晰的客户端,它会不会自己返回的小提琴,这是池的责任处置小提琴。
或者只能通过文档方式解决这个问题吗?
有没有办法走出困境?还有什么困难吗? :-)
谢谢,第一个更好地遵循Demeter法则,第二个更适合我的整体设计。嗯... – 2010-02-25 22:18:36
我会把我的两分钱的第一种方法 - 我见过有太多人尝试编写自己的SqlConnnection池! (不是真的,但我*有必须解释为什么没有必要。) – 2010-02-26 15:52:32