9.原型模式
来源:互联网 发布:人民币大写转换编程 编辑:程序博客网 时间:2024/06/14 18:26
package prototypePattern;import java.util.ArrayList;import java.util.List;/** * 原型模式 * * @author LiMing E-mail:1151143484@qq.com * @date 2017年6月14日 上午8:59:49 * * * * 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 我理解的原型模型就是☆克隆对象☆ * ☆原型模式的注意事项 * ☆使用原型模式复制对象不会调用类的构造方法 * ☆因为对象的复制是通过调用Object类的clone方法来完成的,它直接在内存中复制数据,因此不会调用到类的构造方法 * ☆不但构造方法中的代码不会执行 * ☆甚至连访问权限都对原型模式无效。 * ------ 还记得单例模式吗?单例模式中,只要将构造方法的访问权限设置为private型,就可以实现单例 ☆ * ------ 但是clone方法直接无视构造方法的权限,所以,单例模式与原型模式是冲突的,在使用时要特别注意。 ☆ * ☆ 深拷贝与浅拷贝。 * ☆Object类的clone方法只会拷贝对象中的基本的数据类型 * ☆对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。 * ------ PS:深拷贝与浅拷贝问题中,会发生深拷贝的有java中的8中基本类型以及他们的封装类型,另外还有String类型。其余的都是浅拷贝。 * */public class PrototypePattern {public static void main(String[] args) {ConcretePrototype cp = new ConcretePrototype();for (int i = 0; i < 10; i++) {ConcretePrototype clonecp = (ConcretePrototype) cp.clone();clonecp.show();//这个输出你可以先把 prototype.list = (List) ((ArrayList) this.list).clone(); //注释掉 然后再运行 取消注释再运行 运行结果不一样 是因为不深拷贝list会公用一个地址 如果深拷贝后会自己用自己的listSystem.out.println(clonecp.list.add(i)+":"+clonecp.list);}}}//可clone父类class Prototype implements Cloneable {public List<Object> list = new ArrayList<Object>();@SuppressWarnings({ "unchecked", "rawtypes" })public Prototype clone() {Prototype prototype = null;try {prototype = (Prototype) super.clone();//list不会被深拷贝 想要深拷贝需要自己写相关代码 手动clone prototype.list = (List) ((ArrayList) this.list).clone(); } catch (CloneNotSupportedException e) {e.printStackTrace();}return prototype;}}//可clone子类class ConcretePrototype extends Prototype {public void show() {System.out.println("原型模式实现类");}}
阅读全文
0 0
- 9.原型模式
- 9.原型模式
- 设计模式--9.原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型 模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 7.代理模式
- HTML基础--表格标签 04
- 8.工厂方法
- 仿QQ左滑删除
- Microsoft.CSharp.RuntimeBinder.RuntimeBinderException类型未处理的异常在 System.Core.dll 中发生
- 9.原型模式
- 设计模式(20)-Command 命令模式
- centos6.5 安装git
- Storm1.1.0<Error preparing HdfsBolt: No FileSystem for scheme: hdfs>
- 登录不用submit
- (1) Shell 脚本简介
- 常用cmd命令
- 10.模板方法模式
- 亲测 vs2010 + qt-opensource-windows-x86-vs2010-4.8.6 纯静态库编译