原型模式

1、原型模式

1、定义

  • 拷贝一个对象创建新的对象

2、使用场景

  • 类初始化需要消耗非常多的资源;
  • 通过new需要非常繁琐的数据准备或访问权限;
  • 一个对象需要提供给其他对象访问,而且每个调用者可能都需要修改其值;

3、例子

  • 文档类
    实现Cloneable,但clone方法不属于Cloneable,属于Object,Cloneable表示可克隆标识,没有实现调用clone抛异常。

    public class WordDocument implements Cloneable {
    
      private String text;
    
      private ArrayList mImages = new ArrayList<>();
    
      public String getText() {
          return text;
      }
    
      public void setText(String text) {
          this.text = text;
      }
    
      public ArrayList getImages() {
          return mImages;
      }
    
      public void setImages(ArrayList 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();     //打印一样的内容
          document1.showDocument();
    
          document1.setText("2");
          document1.addImage("图片2");
    
          document.showDocument();   //输出1,但图片输出图片1和图片2
          document1.showDocument(); //输出2,图片输出图片1和图片2
    
      }
    

3、浅拷贝和深拷贝

  • 上面例子并没有构建一个新的mImages,因为浅拷贝引用类型指向同一个对象。

  • 深拷贝,修改clone方法:

     @Override
      public WordDocument clone() {
          try {
              WordDocument document = (WordDocument) super.clone();
              document.mImages = (ArrayList) this.mImages.clone();
              return document;
          } catch (CloneNotSupportedException e) {
              e.printStackTrace();
              return null;
          }
    
      }
    

4、注意

  • clone并不一定比newk快,只有当通过new构造对象较为耗时或者成本高时,通过clone才能有效率提升。
  • clone不会走构造方法。

你可能感兴趣的:(原型模式)