摘要:本文将带你了解Android应用开发Android 开发设计模式之原型模式解析,希望本文对大家学Android有所帮助。
本文将带你了解Android应用开发Android 开发设计模式之原型模式解析,希望本文对大家学Android有所帮助。
Android 开发设计模式之原型模式解析。
定义
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象
使用场景
类初始化需要消耗非常多的资源,这个资源包括数据、硬件资源等,通过原型拷贝避免这些消耗 通过new产生一个对象需要非常繁琐的数据准备或访问权限,这时可以使用原型模式 一个对象需要供给其他对象访问,而且各个对象都需要修改其值时,可以拷贝多个对象供调用者访问,即保护性拷贝
使用例子
我们常用的Intent,ArrayList等 登录模块中保存的用户信息类需要通过服务器更新用户信息,但是有很多地方需要调用,需要设置为对其他用到的模块只读,这个时候可以考虑用原型模式进行保护性拷贝
实现
2大角色
抽象类或接口,声明具备clone的能力 具体的原型类
实现的要点
实现Cloneable接口 覆写Object的clone方法
实现方式
下面以文档拷贝的例子来演示一下简单的原型模式
文档类
public class WordDocument implements Cloneable {
//文本
private String text;
//图片
private ArrayList
public WordDocument() {
System.out.println(---WordDocument 构造函数---);
}
@Override
protected WordDocument clone() {
try {
WordDocument document = (WordDocument) super.clone();
document.text = this.text;
document.images = this.images;
return document;
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public ArrayList
return images;
}
public void addImage(String img) {
images.add(img);
}
/**
* 打印文档内容
*/
public void showDocument() {
System.out.println(---Word content start---);
System.out.println(Text : + text);
System.out.println(images list : );
for (String name : images) {
System.out.println(image name : + name);
}
System.out.println(---Word content end---);
}
}
上面模拟创建了一个文档,里面包含文字和图片。拷贝时通过clone方法生成新的文档,并把文字和图片都拷贝到新的文档中 下面是测试代码
WordDocument doc1 = new WordDocument();
doc1.setText(这是一篇文档);
doc1.addImage(图片1);
doc1.addImage(图片2);
doc1.addImage(图片3);
doc1.showDocument();
WordDocument doc2 = doc1.clone();
doc2.showDocument();
doc2.setText(这是修改过的文档);
doc2.addImage(图片4);
doc2.showDocument();
doc1.showDocument();
下面是测试的输出
---WordDocument 构造函数---
---Word content start---
Text : 这是一篇文档
images list :
image name : 图片1
image name : 图片2
image name : 图片3
---Word content end---
---Word content start---
Text : 这是一篇文档
images list :
image name : 图片1
image name : 图片2
image name : 图片3
---Word content end---
---Word content start---
Text : 这是修改过的文档
images list :
image name : 图片1
image name : 图片2
image name : 图片3
image name : 图片4
---Word content end---
---Word content start---
Text : 这是一篇文档
images list :
image name : 图片1
image name : 图片2
image name : 图片3
image name : 图片4
---Word content end---
不知道大家看了上面的测试有什么发现? 首先我们成功拷贝了原始的文档。但是当我们修改拷贝后的副文档时,原始的文档也改变,这显然是不行的。
浅拷贝和深拷贝
浅拷贝又叫影子拷贝,上面我们在拷贝文档时并没有把原文档中的字段都重新构造了一遍,而只是拷贝了引用,也就是副文档的字段引用原始文档的字段,这样的话修改副文档中的内容就会连原始文档也改掉了,这就是浅拷贝 深拷贝就是在浅拷贝的基础上,对于引用类型的字段也要采用拷贝的形式,比如上面的images,而像String、int这些基本数据类型则没关系 所以在运用原型模式时建议大家还是用深拷贝,下面我们把上面的浅拷贝改成深拷贝
public class WordDocument implements Cloneable {
//文本
private String text;
//图片
private ArrayList
public WordDocument() {
System.out.println(---WordDocument 构造函数---);
}
@Override
protected WordDocument clone() {
try {
WordDocument document = (WordDocument) super.clone();
document.text = this.text;
//document.images = this.images;
//改成深拷贝
document.images = (ArrayList
return document;
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
//省略其他代码
/**
* 打印文档内容
*/
public void showDocument() {
//省略打印
}
}
此外还要注意的是,拷贝的时候不会调用构造函数!
Intent中的原型模式
@Override
public Object clone() {
return new Intent(this);
}
private Intent(Intent o, boolean all) {
this.mAction = o.mAction;
this.mData = o.mData;body{ }
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号