定義:用原型實例指定建立對象的種類,並經過拷貝這些原型建立新的對象。java
類型:建立類模式數組
類圖:安全
原型模式主要用於對象的複製,它的核心是就是類圖中的原型類Prototype。Prototype類須要具有如下兩個條件:性能
原型模式是一種比較簡單的模式,也很是容易理解,實現一個接口,重寫一個方法即完成了原型模式。在實際應用中,原型模式不多單獨出現。常常與其餘模式混用,他的原型類Prototype也經常使用抽象類來替代。this
Java實現代碼:spa
class Prototype implements Cloneable { public Prototype clone(){ Prototype prototype = null; try{ prototype = (Prototype)super.clone(); }catch(CloneNotSupportedException e){ e.printStackTrace(); } return prototype; } } class ConcretePrototype extends Prototype{ public void show(){ System.out.println("原型模式實現類"); } } public class Client { public static void main(String[] args){ ConcretePrototype cp = new ConcretePrototype(); for(int i=0; i< 10; i++){ ConcretePrototype clonecp = (ConcretePrototype)cp.clone(); clonecp.show(); } } }
原型模式的優勢及適用場景prototype
使用原型模式建立對象比直接new一個對象在性能上要好的多,由於Object類的clone方法是一個本地方法,它直接操做內存中的二進制流,特別是複製大對象時,性能的差異很是明顯。code
使用原型模式的另外一個好處是簡化對象的建立,使得建立對象就像咱們在編輯文檔時的複製粘貼同樣簡單。對象
由於以上優勢,因此在須要重複地建立類似對象時能夠考慮使用原型模式。好比須要在一個循環體內建立對象,假如對象建立過程比較複雜或者循環次數不少的話,使用原型模式不但能夠簡化建立過程,並且可使系統的總體性能提升不少。blog
原型模式的注意事項
public class Prototype implements Cloneable { private ArrayList list = new ArrayList(); public Prototype clone(){ Prototype prototype = null; try{ prototype = (Prototype)super.clone(); prototype.list = (ArrayList) this.list.clone(); }catch(CloneNotSupportedException e){ e.printStackTrace(); } return prototype; } }
因爲ArrayList不是基本類型,因此成員變量list,不會被拷貝,須要咱們本身實現深拷貝,幸運的是java提供的大部分的容器類都實現了Cloneable接口。因此實現深拷貝並非特別困難。
PS:深拷貝與淺拷貝問題中,會發生深拷貝的有java中的8中基本類型以及他們的封裝類型,另外還有String類型。其他的都是淺拷貝。