Android编程设计模式之原型模式实例详解
一、原型模式
原型模式是一种创建型设计模式,它通过复制现有的对象来创建新的对象,这种模式的核心思想是“克隆”,即通过创建一个对象的副本(克隆)而非从头开始构建,以节省资源和时间,特别是在对象创建复杂或耗时的情况下。
二、原型模式的定义
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象,原型模式允许开发者通过复制现有对象来快速创建新的实例,而无需重新初始化所有属性。
三、使用场景
1、类初始化需要消耗大量资源:例如处理大量数据或硬件交互,通过原型拷贝可以避免这些资源的重复消耗。
2、对象创建过程繁琐:当创建一个对象需要繁琐的数据准备或访问权限时,原型模式提供了一种快速的替代方案。
3、保护性拷贝:当多个用户需要同时修改一个对象时,可以通过原型模式提供多个独立的副本,以避免数据冲突。
四、注意事项
需要注意的是,并非所有实现Cloneable接口的对象通过clone方法都会比new操作更快,只有当new操作成本较高时才会有性能优势,实现原型模式也不一定非要实现Cloneable接口,也有其他的实现方式。
五、原型模式的UML类图
Client:客户端用户。
Prototype:抽象类或者接口,声明具备clone能力。
ConcretePrototype:具体的原型类。
六、原型模式的简单实现
下面以一个简单的文档拷贝为例来演示一下简单的原型模式,我们在这个例子中首先创建了一个文档对象WordDocument,这个文档中含有文字和图片,用户经过了长时间的内容编辑后,打算对该文档做进一步的编辑,这个编辑后的文档是否会被采用还不确定,为了安全起见,用户需要将当前文档拷贝一份,然后再在文档副本上进行修改,这与《Effective Java》一书中提到的保护性拷贝有些类似,这个原始文档就是我们上述所说的样板实例,也就是将要被“克隆”的对象,我们成为原型。
示例代码:
public class WordDocument implements Cloneable { //文本 private String mText; //图片名列表 private ArrayList<String> mImages = new ArrayList<>(); public WordDocument() { System.out.println("-------WordDocument构造函数 ---------"); } @Override protected WordDocument clone() { WordDocument document; try { document = (WordDocument) super.clone(); document.mText = this.mText; document.mImages = new ArrayList<>(this.mImages); // 深拷贝 return document; } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } public String getText() { return this.mText; } public void setText(String text) { this.mText = text; } public void addImage(String img) { this.mImages.add(img); } public void showDocument() { System.out.println("Text : " + mText + " Images : " + mImages.toString()); } }
Client使用:
public static void main(String[] args) { WordDocument wordDocument = new WordDocument(); wordDocument.setText("这是一篇文档!"); wordDocument.addImage("图片一"); wordDocument.addImage("图片二"); wordDocument.addImage("图片三"); wordDocument.addImage("图片四"); wordDocument.showDocument(); //以原始文档为原型,拷贝一份副本 WordDocument wordDocument_clone = wordDocument.clone(); wordDocument_clone.showDocument(); //修改文档副本,不会影响原始文档 wordDocument_clone.setText("这是修改过的Doc2文本"); wordDocument_clone.showDocument(); wordDocument.showDocument(); }
结果:
----------WordDocument 构造函数 --------- Text : 这是一篇文档! Images : [图片一, 图片二, 图片三, 图片四] Text : 这是一篇文档! Images : [图片一, 图片二, 图片三, 图片四] Text : 这是修改过的Doc2文本 Images : [图片一, 图片二, 图片三, 图片四] Text : 这是一篇文档! Images : [图片一, 图片二, 图片三, 图片四]
从上面的输出可以看出,wordDocument_clone是通过wordDocument.clone()创建的,并且wordDocument_clone第一次输出的时候和wordDocument输出是一样的,通过clone对象时并不会执行构造函数!
七、浅拷贝与深拷贝
原型模式的实现是一个浅拷贝,也叫影子拷贝,这份拷贝实际上并不是将原始对象的所有字段都重新构造了一遍,而是副本的字段引用了原始对象的字段,所以原始字段内容发生改变,而副本在还引用着它的情况下也会跟着改变,当然副本修改字段的内容,原始对象也会跟着改变,解决这个问题的方案就是采用深拷贝,即在拷贝对象时,对于引用类型的字段也要采用拷贝的形式,而不是单纯引用的形式。
以上内容就是解答有关“Android编程设计模式之原型模式实例详解”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/638528.html