原型模式
原型模式是一种对象创建型模式,用原型实例指定创建对象的种类,并通股票复制这些原型创建新的对象。原型模式的基本工作原理是通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象复制原型来实现创建过程。在原型模式中存在浅克隆和深克隆。理解C++的浅复制和深复制。在Java中浅克隆一般要实现Cloneable接口,而深克隆要实现Serializable接口。
//java代码
//浅克隆
//Attachment.java
package com.designpattern.prototype.shadowclone;
public class Attachment {
public void download(){
System.out.println("下载附件");
}
}
//Emial.java
package com.designpattern.prototype.shadowclone;
public class Email implements Cloneable {
private Attachment attachment = null;
public Email(){
attachment = new Attachment();
}
public Attachment getAttachment() {
return attachment;
}
public Object clone() {
Email clone = null;
try {
clone = (Email)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}
//test.java
package com.designpattern.prototype.shadowclone;
public class test {
public static void main(String[] args) {
Email email = new Email();
Email copyEmail = (Email)email.clone();
System.out.println("email == copyEmail");
System.out.println(email == copyEmail);
System.out.println("email.getAttachment() == copyEmail.getAttachment()");
System.out.println(email.getAttachment() == copyEmail.getAttachment());
}
}
//深克隆
//Attachment.java
package com.designpattern.prototype.deepclone;
import java.io.Serializable;
public class Attachment implements Serializable{
public void download(){
System.out.println("下载附件");
}
}
//Email.java
package com.designpattern.prototype.deepclone;
import java.io.*;
public class Email implements Serializable {
private Attachment attachment = null;
public Email(){
attachment = new Attachment();
}
public Attachment getAttachment() {
return attachment;
}
public Object clone(){
ByteArrayOutputStream bao =null;
ObjectOutputStream oos =null;
ObjectInputStream ois= null;
ByteArrayInputStream bis =null;
Object ret= null;
try {
bao = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bao);
oos.writeObject(this);
bis = new ByteArrayInputStream(bao.toByteArray());
ois = new ObjectInputStream(bis);
ret = ois.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return ret;
}
}
//test.java
和上面浅克隆的一样。