Java设计模式(5)创建型:原型模式
2016-12-20 17:29
405 查看
(一)模式概念
原型模式是指用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节。工作原理:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。原型模式主要面对的问题是:某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。
原型模式有两种拷贝情况:浅复制和深复制。
1)浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
2)深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。
现在重新来了解一下基本数据类型和引用数据类型:
基本数据类型 8种:
整型: byte 1字节 short 2 字节 int 4 字节 long 8 字节 浮点型: float 4 字节 double 8 字节 Unicode编码的字符单元 char 2 字节 真值类型 boolean 1 位引用数据类型 3种:
类class 接口interface 数组array
(二)Demo
1)浅复制
NativePrototype类原型实例,需实现Cloneable 接口:
public class NativePrototype implements Cloneable { public int i = 0; // 基本类型 public int t = 0; // 基本类型 public LinkedList<Integer> list = new LinkedList<Integer>(); // 引用类型 public Object clone() throws CloneNotSupportedException { NativePrototype proto = (NativePrototype) super.clone(); return proto; } }执行代码:
// 浅复制 NativePrototype np = new NativePrototype(); np.i = 10; np.list.add(10); np.t = 10; NativePrototype npclone = (NativePrototype) np.clone(); np.list.add(11); System.out.println(npclone.i); System.out.println(npclone.list); System.out.println(npclone.t);
执行结果:
10 [10, 11] 10
2)深复制
SerializablePrototype类原型实例,需实现Serializable接口:
public class SerializablePrototype implements Serializable { private static final long serialVersionUID = 1L; public int i = 0; // 基本类型 public transient int t = 0;// transient关键字的成员不会被序列化 public LinkedList<Integer> list = new LinkedList<Integer>(); // 引用类型 public Object deepClone() throws IOException, ClassNotFoundException { /* 写入当前对象的二进制流 */ ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); /* 读出二进制流产生的新对象 */ ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return ois.readObject(); } }执行过程:
// 深复制 SerializablePrototype sp = new SerializablePrototype(); sp.i = 10; sp.list.add(10); sp.t = 10; SerializablePrototype spclone = (SerializablePrototype) sp.deepClone(); sp.list.add(11); System.out.println(spclone.i); System.out.println(spclone.list); System.out.println(spclone.t);
执行结果:
10 [10] 0(注)此处System.out.println(spclone.t)的值为0是因为SerializablePrototype类中t定义时加了transient,此时复制不会把值也复制过来。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Debian 7.x 安装Oracle JAVA
- springmvc实现url路由功能
- spring boot 配置 druid/** * 配置druid * Created by adam on 4/11/16. */ @Configuration public class D
- api接口rsa加密
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法