Я, кажется, мысленно застрял в дилемме модели «Вес».
Сначала, скажем, у меня есть одноразовый тип DisposableFiddle
и фабрика FiddleFactory
:
public interface DisposableFiddle : IDisposable
{
// Implements IDisposable
}
public class FiddleFactory
{
public DisposableFiddle CreateFiddle(SomethingThatDifferentiatesFiddles s)
{
// returns a newly created fiddle.
}
}
Тогда, на мой взгляд, клиенту FiddleFactory
совершенно ясно, что фабрика не претендует на право собственности на созданную скрипку и что клиент обязан утилизировать скрипку, когда с ней покончили.
Однако давайте вместо этого скажем, что я хочу разделить скрипки между клиентами, используя шаблон Flyweight:
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
}
Тогда клиенту станет понятнее, что он не будет владеть возвращенной скрипкой, и пул обязан утилизировать скрипки.
Или это может быть легко решено только по документации?
Есть ли выход из этой дилеммы? Есть ли даже дилемма? : -)