gpt4 book ai didi

c# - IDisposable 的享元和工厂问题

转载 作者:可可西里 更新时间:2023-11-01 08:45:20 24 4
gpt4 key购买 nike

我似乎陷入了享元模式的困境。

首先,假设我有一个一次性类型 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com