Кажется, что я мысленно застрял в дилемме «Веселый шаблон».Проблема с мухой и фабрикой с 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
}
Тогда это понятнее клиенту, что он не будет владеть возвращаемую скрипкой, и это ответственность пула отчуждать скрипки.
Или это может быть только разрешено документацией?
Есть ли выход из дилеммы? Есть ли даже дилемма? :-)
Спасибо, первый лучше следует за Деметрыем, а второй лучше подходит в моем общем дизайне. Хммм ... –
Я поставлю свои два цента за первый подход - я видел, как слишком много людей пытаются написать свой собственный пул SqlConnnection! (Не совсем, но я * должен был объяснить, почему это не нужно.) –