我在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