6. 原型模式(Prototype)
意图
使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象。
客户端只持有 Prototype,调用 myClone() 就能得到一个同类型的新对象,不需要知道具体类;对象的初始化很耗时(例如要读取配置)时,复制已有对象的状态也比从头初始化更快。
类图
实现
public abstract class Prototype {
abstract Prototype myClone();
}
public class ConcretePrototype extends Prototype {
private String field;
public ConcretePrototype(String field) {
this.field = field;
}
@Override
Prototype myClone() {
return new ConcretePrototype(field);
}
@Override
public String toString() {
return field;
}
}
public class Client {
public static void main(String[] args) {
Prototype prototype = new ConcretePrototype("abc");
Prototype clone = prototype.myClone();
System.out.println(clone.toString());
}
}
abc
JDK 中的应用
需要注意的是,Object#clone() 默认是浅拷贝:只复制字段的值,引用类型的字段在副本中仍指向同一个对象,需要深拷贝时要在 clone() 中再复制这些对象。类还要实现 Cloneable 接口,否则调用 super.clone() 会抛出 CloneNotSupportedException。
参考资料
- 弗里曼. Head First 设计模式 [M]. 中国电力出版社, 2007.
- Gamma E. 设计模式:可复用面向对象软件的基础 [M]. 机械工业出版社, 2007.