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不会走构造方法。