定义
原型模式(Prototype Pattern):原型模式是一种对象创建型模式,用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。原型模式允许一个对象再创建另外一个可定制的对象,无须知道任何创建的细节。
相关的角色
Prototype:抽象原型类
ConcretePrototype:具体原型类
Client:客户类
解决问题
解决某些结构复杂的对象的创建工作。
UML类图

例子
在Java实现原型模式的方法,一般是继承Cloneable接口。
浅拷贝
对于值类型的成员变量,对值进行复制,对于引用类型的成员变量,只复制引用,不复制引用的对象。
public class MonkeyKingPrototype implements Cloneable {
private String name;
private Color color;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
public MonkeyKingPrototype(String name, Color color) {
this.name = name;
this.color = color;
}
@Override
public Object clone() {
MonkeyKingPrototype monkeyKingPrototype = null;
try {
monkeyKingPrototype = (MonkeyKingPrototype) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return monkeyKingPrototype;
}
}
调用
MonkeyKingPrototype monkeyKingPrototype = new MonkeyKingPrototype("monekyOne", new Color("red"));
MonkeyKingPrototype monkeyKingPrototypeClone = (MonkeyKingPrototype) monkeyKingPrototype.clone();
System.out.println(monkeyKingPrototypeClone.getName() + "," + monkeyKingPrototypeClone.getColor().getColor());
monkeyKingPrototypeClone.getColor().setColor("green");
System.out.println(monkeyKingPrototype.getName() + "," + monkeyKingPrototype.getColor().getColor());
深拷贝
深拷贝分两种
- 通过对子引用对象创建
- 通过利用串行化来做深复制
通过对子引用对象创建
public Object deepClone() {
MonkeyKingPrototype monkeyKingPrototype = null;
try {
monkeyKingPrototype = (MonkeyKingPrototype) super.clone();
monkeyKingPrototype.eye = new Eye(this.getEye().getColor());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return monkeyKingPrototype;
}
通过利用串行化来做深复制
把对象写到流里的过程是串行化(Serilization)过程;把对象从流中读出来是并行化(Deserialization)过程. 写在流里的是对象的一个拷贝,然后再从流里读出来重建对象.需要实现
Serializable
通过对象流的形式拷贝
public Object deepClone() throws IOException, ClassNotFoundException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(this);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
return objectInputStream.readObject();
}
优缺点
优点:
-
原型模式向客户隐藏了创建新实例的复杂性;
-
原型模式允许动态增加或较少产品类;
-
原型模式简化了实例的创建结构,工厂方法模式需要有一个与产品类等级结构相同的等级结构,而原型模式不需要这样;
-
产品类不需要事先确定产品的等级结构,因为原型模式适用于任何的等级结构。
缺点:
- 每个类必须配备一个克隆方法;
- 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
网友评论