CS-Notes全部笔记在阅读器中打开

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。

参考资料

在阅读器中可以用目录和搜索、切换深色模式、练习这篇笔记中的面试题:打开《设计模式 - 原型模式》