Skip to content

原型模式

原型模式属于创建型模式的一种。它的核心思想是通过复制已经存在的对象来创建新的对象,而不是通过新建实例的过程。这种模式在需要创建大量相似对象或者创建对象成本较高(比如涉及复杂初始化、数据库查询等)的场景下非常有用。

定义

原型模式定义了对象的创建方式,通过给出一个原型实例来指明新创建的对象的类型,并且通过复制这个原型来创建新的对象。这种方式可以让新对象继承原型对象的属性和行为,从而减少对象创建过程中的复杂性。

类图

原型模式

主要角色

  • 抽象原型(Prototype):这是一个接口或者抽象类,声明了克隆自身的方法,通常是一个名为 clone() 的方法。

  • 具体原型(Concrete Prototype):实现抽象原型的类,需要实现 clone() 方法以提供对象的深拷贝或浅拷贝功能。具体原型类包含了对象状态的详细信息。

工作原理

  1. 客户端请求创建一个新对象时,不是直接使用 new 操作符创建,而是向已经存在的原型对象请求一个克隆。

  2. 原型对象接收到请求后,通过自身的克隆方法创建并返回一个新的对象给客户端。这个新对象与原型对象具有相同的初始状态,但根据需要可以独立修改而不影响原型对象。

  3. 根据实现的不同,克隆可以是浅拷贝或深拷贝。

    1. 浅拷贝只复制对象的基本数据类型成员变量,而引用类型成员变量仍然指向原来的对象;

    2. 深拷贝则会递归复制所有层级的成员变量,使得原型和克隆对象完全独立。

      • 重写clone()
      • 通过序列化

优点

  • 提高效率:对于复杂的对象创建,可以通过克隆已有对象来快速生成新对象,减少了系统开销。
  • 简化创建过程:客户端不需要了解对象创建的具体步骤,只需知道如何使用原型对象即可。
  • 易于扩展:通过增加新的具体原型类,可以轻松支持更多类型的对象创建。

缺点

  • 配置管理复杂:如果原型类的属性很多,为了支持深拷贝,需要正确实现所有引用类型的复制逻辑。
  • 违反单一职责原则:如果原型类还需要负责克隆逻辑,可能使其变得复杂,不再仅关注自身的业务逻辑。

适用场景

  • 当创建新对象的成本较大时(如初始化需要复杂计算或数据库查询)。
  • 需要创建的对象之间差异不大,可以通过修改已有对象的少量属性来获得新对象。
  • 需要避免使用构造函数的硬编码来实例化对象,以提供更加灵活的对象创建方式。

实现示例(Java)

在Java中,可以通过实现 Cloneable 接口并重写 clone() 方法来实现原型模式。注意,Java中的 clone() 方法默认是浅拷贝,需要手动处理深拷贝逻辑。

java
public interface Prototype extends Cloneable {
    Prototype clone() throws CloneNotSupportedException;
}

public class ConcretePrototype implements Prototype {
    private String attribute;

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

    @Override
    public Prototype clone() throws CloneNotSupportedException {
        // 实现深拷贝,如果有引用类型成员,需手动处理
        return (ConcretePrototype) super.clone();
    }
}

客户端代码示例:

java
ConcretePrototype original = new ConcretePrototype("Original Value");
ConcretePrototype cloned = original.clone(); // 通过克隆得到新对象

Released under the MIT License.