原型模式

1、原型模式

1、定义

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

2、使用场景

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

3、例子

  • 文档类
    实现Cloneable,但clone方法不属于Cloneable,属于Object,Cloneable表示可克隆标识,没有实现调用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();     //打印一样的内容
          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<String>) this.mImages.clone();
              return document;
          } catch (CloneNotSupportedException e) {
              e.printStackTrace();
              return null;
          }
    
      }
    

4、注意

  • clone并不一定比newk快,只有当通过new构造对象较为耗时或者成本高时,通过clone才能有效率提升。
  • clone不会走构造方法。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容