?眾所周知,創建型設計模式中的都會創建對象。
可是對象在哪兒釋放呢?
當然,對於抽象工廠和工廠方法以及原型模式中,可以保存一個引用然後在需要的地方把它釋放掉。可Singleton模式中卻沒有這樣的引用,或是不能確定它是否創建了。
此時,Dephi的組件的生存期管理機制就非常有用了,你只需要從TCompenent繼承,並在構造函數中把自己的Owner設為另一個被管理的組件(一般來說是你的Form,Frame之類),你創建的對象就會在它的Owner被釋放時自動釋放掉。呵呵,再也不用羨慕Java程序員了:)
什麼時候從TCompenent繼承使用?
我的建議是:只要可以任何時候。
由於在創建類的時候不能預測它的使用方式(我不能,也許你能),所以最好新建類都從TCompenent或TCompenent的派生類繼承,這樣可以防止以後對象的生存期不好處理,而且TCompenent實現了IInterface接口,由於我們的所有的接口都是從IInterface繼承(IUnknow也是),所以如果的你的類想實現接口的話,也最好從TCompenent或TCompenent的派生類繼承,否則的話你必須自己實現下面這三個方法。
??? function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
??? function _AddRef: Integer; stdcall;
??? function _Release: Integer; stdcall;
當然如果你要必須要繼承的基類不是從TCompenent繼承的,那我也沒什麼好辦法啦。
什麼時候自己釋放什麼時候交給Owner釋放?
先說一下區別,自己釋放可以更加有效的利用資源,有更少資源占用。由Owner釋放,可以減少錯誤率,減少代碼編寫量,使代碼更簡潔。
所以,如果你需要多次創建創建次數未知的就要手動釋放,只創建一次或有限次並對資源占用影響較小的就由Owner釋放好了。一個簡單的原則,所有在你覆蓋 Detroy中釋放的對象都可以由Owner釋放。在方法中創建的臨時變量絕對不能這樣設,因為雖然最後對象還是被釋放,但是你可能會多次創建同一個對象,造成大量的資源浪費,除非你把它實現成Singleton。