我似乎陷入了享元模式的思维僵局。
首先,假设我有一个可丢弃类型 DisposableFiddle
和一个工厂 FiddleFactory
:
public interface DisposableFiddle : IDisposable
{
// Implements IDisposable
}
public class FiddleFactory
{
public DisposableFiddle CreateFiddle(SomethingThatDifferentiatesFiddles s)
{
// returns a newly created fiddle.
}
}
在我看来,FiddleFactory
的客户端非常清楚工厂不声称对创建的fiddle拥有所有权,当使用完毕后,由客户端负责处理fiddle的处置。
然而,假设我想通过使用享元模式在客户端之间共享fiddles:
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.
}
}
我感到在道德上有义务使工厂本身可被处理(disposable),因为它创建了小提琴(fiddles)并在其整个生命周期中保留对它们的引用。但这将会给那些假定拥有小提琴并应该处置它们的客户带来问题。
实际上,问题是我将工厂称为 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
}
那么对客户端来说,更明确的是它不会拥有返回的 "fiddle" 对象,而这是池的责任来处理这些对象的清理工作。
或者这只能通过文档来解决吗?
有没有一种方法可以解决这个困境?甚至有困境存在吗? :-)