Java设计模式(5)创建型:原型模式

来源:互联网 发布:淘宝 男装 原单 编辑:程序博客网 时间:2024/05/20 21:59

(一)模式概念

原型模式是指用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。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,此时复制不会把值也复制过来。

0 0