我在Delphi應用程序中實現了FlyWeight模式。一切都很好,一切都快了很多,記憶力也減少了,但有一件事我很擔心。停止Delphi中釋放共享對象的客戶端代碼
只要客戶端代碼從不在調用共享對象上調用Free(),我的實現將只能工作。在Flyweight模式中,FlyweightFactory本身應該「保持對飛重的引用」,即共享對象。
我的問題是,沒有(明顯)的方法來阻止其他代碼銷燬對象,一旦他們有一個引用。我可以忍受這一點,但如果我能夠自由傳遞這些物體而不用擔心意外釋放,那將是一個「大勝利」。
要顯示(人爲)例如:
flyweight1:=FlyweightFactory.GetFlyweight(42);
WriteLn('Description is '+flyweight.Description);
flyweight1.Free;
flyweight2:=FlyweightFactory.GetFlyweight(42);
WriteLn('Description is '+flyweight.Description);
// Object has already been Freed!; behaviour is undefined
我已經考慮重寫析as shown here停止被完全釋放的輕量級對象。這不是我的選擇
a)我只想停止緩存對象免於被釋放,而不是不屬於緩存的對象。有很多遺留代碼不使用緩存;他們仍然需要手動創建和釋放對象。
b)I do想要FlyweightFactory在定稿期間釋放對象;我同意沃倫P的說法,「零泄漏記憶」政策是最好的。
我會從GoF的
的飛錘章報價留下共享性意味着某種形式的 引用計數和垃圾收集 的回收存儲,當它不再需要 。但是, 這兩個都不是必要的,如果flyweights的數量是固定的而且很小。在這種情況下,飛錘值得永久保留 。
在我的情況下flyweights是「固定」和(足夠)小。
[UPDATE見我的回答對我是如何解決這個問題的詳細信息]
換句話說,你做了我的建議。 – 2013-01-15 00:17:42