- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我似乎陷入了享元模式的困境。
首先,假设我有一个一次性类型 DisposableFiddle
和一个工厂 FiddleFactory
:
public interface DisposableFiddle : IDisposable
{
// Implements IDisposable
}
public class FiddleFactory
{
public DisposableFiddle CreateFiddle(SomethingThatDifferentiatesFiddles s)
{
// returns a newly created fiddle.
}
}
然后,在我看来,对于 FiddleFactory
的客户来说,工厂并不声称拥有所创建的 fiddle 的所有权,并且客户有责任在完成后处置 fiddle 。
但是,让我们说我想通过使用享元模式在客户端之间共享 fiddle :
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.
}
}
然后我觉得在道德上有义务让工厂本身成为一次性的,因为它创造了 fiddle 并在他们的整个生命周期中保持对他们的引用。但这会给假定自己拥有 fiddle 并因此应该处置它们的客户带来问题。
问题实际上是我调用工厂 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 ,并且处理 fiddle 是池的责任。
或者这是否只能在文档方面轻松解决?
有没有办法摆脱困境?甚至有两难选择吗? :-)
最佳答案
我可以看到解决这个问题的两种方法:
ThreadPool-style:重新设计类,以便 FiddlePool
提供一个接口(interface)来执行繁琐的操作。该池不会分发 Fiddle
实例,因为它有一个 FiddlePool.PlayFiddle
方法。由于池控制 fiddle 的生命周期,因此它负责处理它们。
SqlConnection-style:修改 Fiddle
的公共(public) dispose 方法,这样它实际上只是将 fiddles 返回到 fiddle 池(fiddle 类封装)。在内部, fiddle 池负责真正释放可支配资源。
关于c# - IDisposable 的享元和工厂问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2336181/
据我所知,对象池是一种创建模式,享元是一种结构模式,但实际上我看不出两者之间有太大区别。有人可以向我解释它们之间的区别以及每种方法在实现中何时有用吗? 最佳答案 一个区别在于享元通常是不可变的实例,而
字符串已经在使用享元设计模式。汇集常见的 String 对象是否有益/性能好?因为字符串已经从字符串池中提取出来了吗? 最佳答案 字符串可以来自很多地方,默认情况下只有字符串文字在字符串池中。例如,当
我是一名优秀的程序员,十分优秀!