原型模式

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)造方法。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容