A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zlb820 中级黑马   /  2016-6-13 20:16  /  731 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

原型模型(prototype)
原型模型的定义:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
不通过new关键字来产生一个对象,而是通过对象的复制来实现的模式就叫做原型模式。
原型模型的核心就是一个clone方法,java提供了一个Cloneable借口来标示这个对象是可以拷贝的,java中只有具有这个标记的对象才可以被拷贝。
优缺点:
优点:
1.性能优良
原型模型是在内存二进制流的拷贝,不直接new一个对象性能好很多,特别是循环体内产生大量的对象时。
2.逃避构造函数的约数
在内存中拷贝,不会执行构造函数。这是一个优点也是缺点。

使用场景:
1、资源优化场景
类的初始化需要消耗很多资源
2.性能和安全要求的场景
通过new关键字产生一个对象,需要非常繁琐的数据准备和访问权限

一个对象需要提供给其他对象访问,并且各个调用者都会修改其值时,用原型模型拷贝多个对象供给调用者。

注意:在实际的项目中,原型模型很少单独使用,一般结合工厂模式一起出现,通过clone的方法拷贝一个对象,然后给工厂方法调用。

原型模型的注意事项:
1.构造函数不会执行
原理:
Object类的clone方法原理是从内存中(堆内存)以二进制流的方式进行拷贝,重新分配一个内存块。
2.浅拷贝和深拷贝
浅拷贝:
java做了一个偷懒的拷贝动作,Object类提供的clone只是拷贝本对象,其对象内部的数组,引用对象都不拷贝,还是指向原生对象的内存地址。
这样拷贝的对象,两个对象共享了一个私有变量
只有内部的数组和引用对象才不能拷贝,其他的原始类型int、long、char等都会被拷贝,但是对于String类型,他没有clone方法,他通过字符串池在需要的时候才在内存中创建新的字符串,在使用的时候把string当做基本类使用即可。

注意:
使用原型模型,引用的成员变量必须满足两个条件才不会被拷贝,1:类的成员变量,而不是方法内变量
2:必须是一个可变的引用对象,而不是一个原始类型或者不可变对象。

深拷贝:

实现了完全的拷贝,不建议深拷贝和浅拷贝混合使用,在涉及继承时,父类有多个引用的情况很复杂,不建议混合使用、

3.final 修饰的  不能拷贝
如果要使用拷贝,就不能在类的成员变量上使用final关键字。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马