设计模式 - 原型模式

87 阅读4分钟

设计模式 - 原型模式

一、引入

原型模式就像复制粘贴一样方便。你可以想象成在制作玩具时,用一个模具做出很多相同的玩具。在程序中,原型模式允许我们通过复制已有的对象来创建新的对象,而不需要从头开始写代码。

比如说,你有一个已经设置好的电子邮件模板,包括收件人、主题和内容。现在你需要发送类似的邮件给不同的人,但只需要修改收件人的名字。这时,你可以使用原型模式,复制原始邮件模板,然后只修改收件人的名字即可,省去了重新设置所有信息的麻烦。

原型模式的优点是节省了创建对象的时间和资源,同时保持了原始对象的状态不被修改。这种模式在需要创建多个相似对象时非常有用,特别是当对象的创建过程比较复杂时。

二、概念

原型模式(Prototype Pattern)是一种创建型设计模式,它允许对象在创建时通过复制一个现有对象的实例来进行创建,而不是通过传统的构造方法。

原型模式的核心思想是通过复制现有对象的状态来创建新的对象,从而避免了创建过程中的一些复杂初始化操作。这在某些情况下可以提升性能和节省资源。

三、基本结构

  1. 原型接口(Prototype) :定义了复制自身的方法,通常包含一个 clone() 方法。
  2. 具体原型类(Concrete Prototype) :实现了原型接口,并实现了复制自身的方法。
  3. 客户端(Client) :使用原型对象的地方,通过复制现有的对象来创建新的对象。

四、示例代码

// 原型接口
interface Prototype {
    Prototype clone();
}
// 具体原型类
class ConcretePrototype implements Prototype {
    private int value;
​
    public ConcretePrototype(int value) {
        this.value = value;
    }
​
    @Override
    public Prototype clone() {
        return new ConcretePrototype(this.value);
    }
​
    public int getValue() {
        return this.value;
    }
}
// 客户端
public class Client {
    public static void main(String[] args) {
        // 创建一个具体原型对象
        ConcretePrototype prototype = new ConcretePrototype(10);
​
        // 使用原型对象来创建新的对象
        ConcretePrototype clone = (ConcretePrototype) prototype.clone();
​
        // 输出新对象的值
        System.out.println("Clone value: " + clone.getValue());
    }
}

在上面的示例中,ConcretePrototype 实现了 Prototype 接口,并在 clone 方法中返回了一个新的实例,从而实现了复制自身的功能。

五、用途

  1. 节省资源和时间

    • 当一个对象的创建过程比复制一个已有对象的成本更高时,原型模式可以节省资源和时间,因为复制操作通常比初始化过程更快。
  2. 简化对象的创建

    • 原型模式可以避免一些复杂的初始化过程,特别是在对象的创建过程中涉及到大量的步骤或者配置项时,使用原型模式可以简化创建过程。
  3. 避免构造函数的复杂初始化

    • 有些对象的初始化过程可能非常复杂,包括大量的参数设置、依赖注入等操作,使用原型模式可以避免这些复杂的初始化过程。
  4. 保护对象状态

    • 原型模式可以保护对象的状态,因为每次创建新对象时都是从现有对象复制得到的,保证了原始对象的状态不会被修改。
  5. 支持动态配置

    • 原型模式可以在运行时动态地配置对象的状态,通过创建一个原型对象然后根据需要修改其状态,可以快速得到新的对象。
  6. 实现可定制的复制操作

    • 在原型模式中,复制操作可以被定制,可以选择深拷贝或浅拷贝,以满足不同的需求。

六、总结

原型模式适用于以下情况:

  • 当一个对象的创建成本比复制一个已有对象的成本更高时。
  • 当需要避免构造函数的复杂初始化过程时。
  • 当一个类的实例只能有几个不同的状态组合,而且需要在运行时动态地创建新的实例。

关注公众号回复“设计模式源码”即可获取源码