Prototype Pattern(原型模式)
意图
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。适用性
• 当要实例化的类是在运行时刻指定时,例如,通过动态装载;• 为了避免创建一个与产品类层次平行的工厂类层次时;
• 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
结构
参与者:
• Prototype(原型)
— 声明一个克隆自身的接口。
• ConcretePrototype(具体的原型)
— 实现一个克隆自身的操作。
• Client(场景)
— 让一个原型克隆自身从而创建一个新的对象。
举例:真假美猴王,每一个美猴王都拥有自己的金箍棒,深拷贝就是每个美猴王都有自己的金箍棒,浅拷贝就是两个美猴王公用一个金箍棒:
import java.io.Serializable;
/**
* 金箍棒
*/
public class JinGuBang implements Serializable{
public int Lengh = 100;
public int diameter = 12;
}
import java.io.*;
import java.util.Date;
/**
*孙悟空的类
*/
public class SunWuKONG implements Cloneable,Serializable{
public JinGuBang jinGuBang;
public Date date = new Date();
@Override
protected SunWuKONG clone() throws CloneNotSupportedException {
/**
* 浅拷贝
*/
//return (SunWuKONG) super.clone();
/**
* 深拷贝
*/
return (SunWuKONG)this.deepClone();
}
/**
* 使用字节数组序列化实现深拷贝
* @param
* @return
*/
private Object deepClone(){
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
SunWuKONG copy = (SunWuKONG)ois.readObject();
return copy;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}
public class test {
public static void main(String[] args) throws Exception {
/**
* 定一个孙悟空,和他的金箍棒
*/
JinGuBang j = new JinGuBang();
SunWuKONG sun = new SunWuKONG();
sun.jinGuBang = j;
/**
* 复制一个美猴王
*/
SunWuKONG copy = sun.clone();
/**
* 选择深度copy或者浅复制都输出的false
*/
System.out.println(sun == copy);
/**
* 选择深度copy输出的false,金箍棒不一样
* 浅复制输出ture,说明两个悟空拿的金箍棒时一样的
*/
System.out.println(sun.jinGuBang);
System.out.println(copy.jinGuBang);
System.out.println(sun.jinGuBang==copy.jinGuBang);
}
}