我似乎精神卡在輕量級模式的困境。輕量級和工廠問題與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
}
然後它更清晰的客戶端,它會不會自己返回的小提琴,這是池的責任處置小提琴。
或者只能通過文檔方式解決這個問題嗎?
有沒有辦法走出困境?還有什麼困難嗎? :-)
謝謝,第一個更好地遵循Demeter法則,第二個更適合我的整體設計。嗯... – 2010-02-25 22:18:36
我會把我的兩分錢的第一種方法 - 我見過有太多人嘗試編寫自己的SqlConnnection池! (不是真的,但我*有必須解釋爲什麼沒有必要。) – 2010-02-26 15:52:32