Wydaje mi się, że utknąłem mentalnie w dylemacie związanym z Flyweight.Problem z wagą i fabryki z IDisposable
pierwsze, powiedzmy, że mam do dyspozycji rodzaj DisposableFiddle
i fabryki FiddleFactory
:
public interface DisposableFiddle : IDisposable
{
// Implements IDisposable
}
public class FiddleFactory
{
public DisposableFiddle CreateFiddle(SomethingThatDifferentiatesFiddles s)
{
// returns a newly created fiddle.
}
}
wtedy moim zdaniem, jest to całkiem jasne dla klienta z FiddleFactory
że fabryka nie rości sobie żadnych praw własności tworzonego skrzypce oraz, że klient jest odpowiedzialny za wyrzucenie skrzypiec po zakończeniu pracy.
Jednak niech zamiast powiedzieć, że chcę podzielić skrzypcach między klientami za pomocą wzoru muszej:
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.
}
}
wtedy czuję się moralnie zobowiązany do fabryki Sam jednorazowy, ponieważ tworzy skrzypce i utrzymuje referencje do nich przez całe ich życie. Ale to mogłoby spowodować problemy dla klientów, którzy zakładali, że są właścicielami skrzypiec i dlatego powinni je wyrzucić.
faktycznie jest problem, który ja nazywam fabrykę FiddleFactory
zamiast, powiedzmy, FiddlePool
i „tworzenie” metoda CreateFiddle
zamiast GetFiddle
? Tak:
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
}
Wtedy to wyraźniej do klienta, że nie będzie właścicielem wracającą skrzypce i jest to odpowiedzialność basenu do dysponowania na skrzypcach.
Czy może to być łatwo rozwiązane tylko w zakresie dokumentacji?
Czy istnieje wyjście z dylematu? Czy istnieje nawet dylemat? :-)
Dzięki, pierwszy podąża za Prawem Demeter lepiej, a drugi pasuje lepiej w moim ogólnym projekcie. Hmmm ... –
Wrzucę moje dwa centy za pierwsze podejście - widziałem, że zbyt wielu ludzi próbuje napisać własną pulę SqlConnection! (Niezupełnie, ale musiałem * musiałem wyjaśnić, dlaczego nie jest to konieczne.) –