原型設計模式

介紹

原型模式雖然是創建型的模式,但是與工廠模式沒有關係,從名字即可看出,該模式的思想就是將一個對象作為原型,對其進行復制、克隆,產生一個和原對象類似的新對象。

代碼

1、先創建一個原型類


原型設計模式

原型類

很簡單,一個原型類,只需要實現Cloneable接口,覆寫clone方法,此處clone方法可以改成任意的名稱,因為Cloneable接口是個空接口,你可以任意定義實現類的方法名,如cloneA或者cloneB,因為此處的重點是super.clone()這句話,super.clone()調用的是Object的clone()方法,而在Object類中,clone方法是native的,具體怎麼實現,此處不再深究。在這兒,我將結合對象的淺複製和深複製來說一下,首先需要了解對象深、淺複製的概念:

淺複製:將一個對象複製後,基本數據類型的變量都會重新創建,而引用類型,指向的還是原對象所指向的。

深複製:將一個對象複製後,不論是基本數據類型還有引用類型,都是重新創建的。

簡單來說,就是深複製進行了完全徹底的複製,而淺複製不徹底。


2、深拷貝

原型設計模式

深拷貝

優點

1、 根據客戶端要求實現動態創建對象,客戶端不需要知道對象的創建細節,便於代碼的維護和擴展。

2、使用原型模式創建對象比直接new一個對象在性能上要好的多,因為Object類的clone方法是一個本地方法,它直接操作內存中的二進制流,特別是複製大對象時,性能的差別非常明顯。所以在需要重複地創建相似對象時可以考慮使用原型模式。比如需要在一個循環體內創建對象,假如對象創建過程比較複雜或者循環次數很多的話,使用原型模式不但可以簡化創建過程,而且可以使系統的整體性能提高很多。

注意事項

1、 使用原型模式複製對象不會調用類的構造方法。因為對象的複製是通過調用Object類的clone方法來完成的,它直接在內存中複製數據,因此不會調用到類的構造方法。不但構造方法中的代碼不會執行,甚至連訪問權限都對原型模式無效。還記得單例模式嗎?單例模式中,只要將構造方法的訪問權限設置為 private型,就可以實現單例。但是clone方法直接無視構造方法的權限,所以,單例模式與原型模式是衝突的。

2、在使用時要注意深拷貝與淺拷貝的問題。clone方法只會拷貝對象中的基本的數據類型,對於數組、容器對象、引用對象等都不會拷貝,這就是淺拷貝。如果要實現深拷貝,必須將原型模式中的數組、容器對象、引用對象等另行拷貝。

思考

spring中哪裡用到了原型設計模式?


分享到:


相關文章: