Java设计模式之原型模式(Prototype)

61 阅读2分钟

原型模式(Prototype Pattern)是一种创建型设计模式,用于创建重复的对象,同时保持性能。这种模式允许通过拷贝现有的实例(原型)来创建新的实例,而不是通过新建对象。

原型模式包含以下几个关键角色:

  1. Prototype(抽象原型类) :声明克隆自己的接口。
  2. ConcretePrototype(具体原型类) :实现抽象原型类,具体实现克隆操作。
  3. Client(客户类) :使用具体原型类来克隆对象。

原型模式的典型代码结构如下:

// 抽象原型类
interface Prototype {
    Prototype clone(); // 克隆方法
}

// 具体原型类
class ConcretePrototype implements Prototype {
    private String field;

    public ConcretePrototype(String field) {
        this.field = field;
    }

    public String getField() {
        return field;
    }

    public void setField(String field) {
        this.field = field;
    }

    @Override
    public Prototype clone() {
        try {
            return (ConcretePrototype) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }
}

// 客户类
class Client {
    public static void main(String[] args) {
        ConcretePrototype prototype = new ConcretePrototype("Original");
        ConcretePrototype clone = prototype.clone();
        clone.setField("Cloned");
        System.out.println(prototype.getField()); // 输出 "Original"
        System.out.println(clone.getField());     // 输出 "Cloned"
    }
}

使用原型模式的示例:

public class PrototypeDemo {
    public static void main(String[] args) {
        Prototype prototype = new ConcretePrototype("Original");
        Prototype clone = prototype.clone();
        clone.setField("Cloned");
        System.out.println("Original: " + ((ConcretePrototype)prototype).getField());
        System.out.println("Cloned: " + ((ConcretePrototype)clone).getField());
    }
}

输出结果:

Original: Original
Cloned: Cloned

原型模式的优点包括:

  • 简化对象创建:通过克隆来创建对象,避免了复杂的构造过程。
  • 性能优化:对于创建成本较高的对象,克隆可以提高性能。
  • 动态性:可以在运行时动态地增加或修改原型。

原型模式的缺点包括:

  • 克隆复杂性:如果对象包含不可克隆的资源,如线程或文件句柄,实现克隆会比较复杂。
  • 深拷贝与浅拷贝问题:需要区分克隆是深拷贝还是浅拷贝,以避免共享对象状态。

原型模式适用于以下场景:

  • 当创建新对象成本较大时,如初始化需要较多资源。
  • 当系统需要通过复制现有的对象来创建新的实例时。
  • 当一个对象需要多个子系统使用,而这些子系统要求对象保持不变时。