原型模式
来源:互联网 发布:淘宝魔镜插件下载 编辑:程序博客网 时间:2024/06/14 23:04
1.定义
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。被复制的实例就是“原型”,这个原型是可定制的。
2.示例
public class WordDocument implements Cloneable { private String mText; private ArrayList<String> mImages = new ArrayList<String>(); public WordDocument() { super(); System.out.println("WordDocument"); } public String getText() { return mText; } public void setText(String mText) { this.mText = mText; } public ArrayList<String> getmImages() { return mImages; } public void setImages(ArrayList<String> mImages) { this.mImages = mImages; } public void addImg(String img){ this.mImages.add(img); } @Override public String toString() { return "WordDocument [mText=" + mText + ", mImages=" + mImages + "]"; } @Override protected WordDocument clone() throws CloneNotSupportedException { try { WordDocument document = (WordDocument) super.clone(); //document.mImages = (ArrayList<String>) this.mImages.clone(); //没有这句话表示浅拷贝,也就是C++的引用传递 return document; } catch (Exception e) { e.printStackTrace(); } return null; }}
测试代码:
public static void main(String[] args) throws CloneNotSupportedException { WordDocument doc = new WordDocument(); doc.setText("origin"); doc.addImg("img ori"); System.out.println(doc); System.out.println("--------------------clone-------------------------"); WordDocument doc2 = doc.clone(); System.out.println(doc2); doc2.setText("modify"); doc2.addImg("img 2"); System.out.println(doc2); System.out.println(doc); }
实例中如果有注释,也就是浅拷贝,那么打印情况如下
WordDocumentWordDocument [mText=origin, mImages=[img ori]]--------------------clone-------------------------WordDocument [mText=origin, mImages=[img ori]]WordDocument [mText=modify, mImages=[img ori, img 2]]WordDocument [mText=origin, mImages=[img ori, img 2]]//****引用传递传的是地址,所以把对应地址保存的数据改了,那么原数据也改了
如果改成深拷贝
WordDocumentWordDocument [mText=origin, mImages=[img ori]]--------------------clone-------------------------WordDocument [mText=origin, mImages=[img ori]]WordDocument [mText=modify, mImages=[img ori, img 2]]WordDocument [mText=origin, mImages=[img ori]]//原数据没变
3.总结
优点
(1)原型模式是在内存中二进制流的拷贝,要比直接new一个对象性能好很多,特别是要在一个循环体内产生大量对象时,原型模式可能更好的体现其优点。
(2)还有一个重要的用途就是保护性拷贝,也就是对某个对象对外可能是只读的,为了防止外部对这个只读对象的修改,通常可以通过返回一个对象拷贝的形式实现只读的限制。
缺点:
(1)这既是它的优点也是缺点,直接在内存中拷贝,构造函数是不会执行的,在实际开发中应该注意这个潜在问题。优点是减少了约束,缺点也是减少了约束,需要大家在实际应用时考虑。
(2)通过实现Cloneable接口的原型模式在调用clone函数构造实例时并不一定比通过new操作速度快,只有当通过new构造对象较为耗时或者说成本较高时,通过clone方法才能够获得效率上的提升。
参考:http://blog.csdn.net/qq_17766199/article/details/50265009
0 0
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型 模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- mybatis系列笔记(4)---输入输出映射
- 对JQuery在循环中绑定事件的问题理解
- sdutacm-Pots
- Mac搭建自己的IntelliJ IDEA授权服务器,自定义用户名激活JetBrains IDE
- ftrace的使用
- 原型模式
- 使用朴素贝叶斯分类器进行文档分类
- 机器学习[1]_调用sklearn中的RF算法
- 欢迎使用CSDN-markdown编辑器
- linux开启关闭触摸板
- SparkMLib Pipelines学习(一)
- PIC18单片机配置位设置
- C/C++的预编译指令
- 有关opencv的学习(6)—图像的HSV色彩空间