您的位置:首页 > 编程语言 > Java开发

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设计模式 java