淺復制與深復制
- 淺復制被復制對象的所有變量都含有與原來對象相同的值,而所有的對其他對象的引用仍然只指向原來的對象,換言之,淺復制默認只對值類型和String類型進行復制, 對于引用類型仍然指向原來的對象(內存地址相同,修改其中一個會影響到所有引用的對象)。
- 深復制在淺復制的基礎上,對于引用類型的對象進行復制(內存地址不同,深復制后的所有對象對應內存都是不同值,互相修改不會印象)
原型模式優點
- 根據客戶端要求實現動態穿件對象,客戶端不需要知道對象的創建細節,便于代碼的維護和擴展。
- 使用原型模式創建的對象如果比較復雜,會比直接new一個對象在性能上好很多,因為object的clone是本地方法,直接操縱二進制數據,在復制大對象的時候非常明顯,比如需要在一個循環體內創建對象,I假如對象創建過程比較復雜,使用原型模式可以簡化步驟。
原型模式的注意事項
使用原型模式復制對象不會調用類的構造方法,因為對象的復制是通過內存中來進行復制,不僅構造方法不會調用,訪問權限也會失效。所以在某種程度上來講,原型模式和單例模式是向沖突的。
在使用時一定要注意深拷貝與淺拷貝的問題,clone方法只會拷貝對象的基本的數據類型和String類型,對于數組、容器對象、引用對象等都不會拷貝。如果需要對數組 容器對象,引用對象進行拷貝,需要另行拷貝。
如果對象比較復雜,可以考慮實現Serializable接口,通過序列化和反序列化來進行深拷貝。