原型模式——HeadFirst设计模式学习笔记
生活随笔
收集整理的這篇文章主要介紹了
原型模式——HeadFirst设计模式学习笔记
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原型模式:通過復(fù)制一個已經(jīng)存在的實例來返回新的實例,而不是新建實例.被復(fù)制的實例就是我們所稱的原型,這個原型是可定制的(clone)
?
特點:
- 向用戶隱藏了創(chuàng)建新實例的復(fù)雜性
- 讓用戶可以產(chǎn)生未知類型的對象,即只需知道對象實現(xiàn)了哪些接口,而無需知道具體是哪種實現(xiàn)
- 在某些情況下,復(fù)制對象比創(chuàng)建對象更高效
?
?
Prototype類需要具備以下兩個條件:
?
- 實現(xiàn)Cloneable接口。在java語言有一個Cloneable接口,它的作用只有一個,就是在運行時通知虛擬機可以安全地在實現(xiàn)了此接口的類上使用clone方法。在java虛擬機中,只有實現(xiàn)了這個接口的類才可以被拷貝,否則在運行時會拋出CloneNotSupportedException異常。
- 重寫Object類中的clone方法。Java中,所有類的父類都是Object類,Object類中有一個clone方法,作用是返回對象的一個拷貝,但是其作用域protected類型的,一般的類無法調(diào)用,因此,Prototype類需要將clone方法的作用域修改為public類型。
?
?
注意復(fù)制對象時的淺拷貝與深拷貝:
- 淺拷貝: 對值類型的成員變量進(jìn)行值的復(fù)制,對引用類型的成員變量只復(fù)制引用,不復(fù)制引用的對象
- 深拷貝: 對值類型的成員變量進(jìn)行值的復(fù)制,對引用類型的成員變量也進(jìn)行引用對象的復(fù)制
注意:
- 使用原型模式復(fù)制對象不會調(diào)用類的構(gòu)造方法。因為對象的復(fù)制是通過調(diào)用Object類的clone方法來完成的,它直接在內(nèi)存中復(fù)制數(shù)據(jù),因此不會調(diào)用到類的構(gòu)造方法
- 單例模式與原型模式是沖突的,在使用時要特別注意
?
實現(xiàn)深拷貝的克隆:
1 public class Prototype implements Cloneable { 2 private ArrayList list = new ArrayList(); 3 public Prototype clone(){ 4 Prototype prototype = null; 5 try{ 6 prototype = (Prototype)super.clone(); 7 prototype.list = (ArrayList) this.list.clone(); 8 }catch(CloneNotSupportedException e){ 9 e.printStackTrace(); 10 } 11 return prototype; 12 } 13 }?
轉(zhuǎn)載于:https://www.cnblogs.com/HectorHou/p/6045181.html
總結(jié)
以上是生活随笔為你收集整理的原型模式——HeadFirst设计模式学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Symbiont
- 下一篇: iOS OC部分 NSString