1、原型模式
1、定義
- 拷貝一個對象創(chuàng)建新的對象
2、使用場景
- 類初始化需要消耗非常多的資源;
- 通過new需要非常繁瑣的數(shù)據(jù)準(zhǔn)備或訪問權(quán)限;
- 一個對象需要提供給其他對象訪問,而且每個調(diào)用者可能都需要修改其值;
3、例子
-
文檔類
實現(xiàn)Cloneable,但clone方法不屬于Cloneable,屬于Object,Cloneable表示可克隆標(biāo)識,沒有實現(xiàn)調(diào)用clone拋異常。public class WordDocument implements Cloneable { private String text; private ArrayList<String> mImages = new ArrayList<>(); public String getText() { return text; } public void setText(String text) { this.text = text; } public ArrayList<String> getImages() { return mImages; } public void setImages(ArrayList<String> images) { mImages = images; } public void addImage(String img) { mImages.add(img); } public void showDocument() { Log.d("--------", text); for (String image : mImages) { Log.d("--------", image); } } @Override public WordDocument clone() { try { return (WordDocument) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } } } -
使用
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); WordDocument document = new WordDocument(); document.setText("1"); document.addImage("圖片1"); WordDocument document1 = document.clone(); document.showDocument(); //打印一樣的內(nèi)容 document1.showDocument(); document1.setText("2"); document1.addImage("圖片2"); document.showDocument(); //輸出1,但圖片輸出圖片1和圖片2 document1.showDocument(); //輸出2,圖片輸出圖片1和圖片2 }
3、淺拷貝和深拷貝
上面例子并沒有構(gòu)建一個新的mImages,因為淺拷貝引用類型指向同一個對象。
-
深拷貝,修改clone方法:
@Override public WordDocument clone() { try { WordDocument document = (WordDocument) super.clone(); document.mImages = (ArrayList<String>) this.mImages.clone(); return document; } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } }
4、注意
- clone并不一定比newk快,只有當(dāng)通過new構(gòu)造對象較為耗時或者成本高時,通過clone才能有效率提升。
- clone不會走構(gòu)造方法。