十、原型模式(Prototype)

设计模式系列专栏【持续更新中,工作日更新,周末要休息】

十、原型模式(Prototype)

1、介绍

原型模式是一种创建型设计模式,其主要目标是通过复制现有的实例来创建新的对象,而不是每次都从头开始用构造函数创建。它主要是为了解决在某些场景中,创建一个对象的成本比较高,或者系统需要创建大量相似的对象,并且希望能够快速高效地完成。

在某些情况下,例如,创建一个对象需要大量的I/O操作、需要对大量数据进行计算或者需要占用大量的系统资源等等,这时候,使用传统的构造函数来创建新对象可能会很慢,甚至可能会影响到系统的性能。原型模式可以通过复制现有的对象来避免这些开销。

另外,在某些系统中,可能需要创建大量相似或者状态相同的对象。如果每次都从头开始创建这些对象,那么可能会造成大量的代码重复,而且也可能会消耗大量的系统资源。原型模式可以通过复制一个原型对象来快速地创建新对象。

例如,在一款实时战略游戏中,可能需要在地图上创建大量相同的单位,例如坦克或者步兵。如果每次都从头开始创建这些单位,那么可能会消耗大量的CPU和内存资源。但是,如果有一个原型单位,那么可以通过复制这个原型单位来快速创建新的单位。

因此,原型模式在很多软件系统中都会出现,尤其是那些需要创建大量相似对象,或者对象创建开销大的系统中。

2、生活实例

想象一下,你正在举办一场大型聚会,你决定每位嘉宾都将收到一份完全相同的邀请函。那么,你会手写每一份邀请函吗?当然不会,这样做效率太低了。你会写一份邀请函,然后复印出足够的份额。这个过程就像是原型模式:创建了一个原型(你的原始邀请函),然后复制它,得到了许多完全一样的对象(复印出来的邀请函)。

3、java代码实例

在 Java 中,可以通过实现 Cloneable 接口和重写 clone 方法来实现原型模式。以下是一个简单的例子:

// 实现 Cloneable 接口
public class Prototype implements Cloneable {
    private String field;

    // 用于设置字段值
    public void setField(String field) {
        this.field = field;
    }

    // 用于获取字段值
    public String getField() {
        return field;
    }

    // 重写 clone 方法
    @Override
    public Prototype clone() {
        try {
            return (Prototype) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }
}

// 使用示例
public class Client {
    public static void main(String[] args) {
        // 创建一个原型实例
        Prototype prototype = new Prototype();
        prototype.setField("Hello, Prototype!");

        // 通过原型复制出一个新的实例
        Prototype cloned = prototype.clone();

        // 打印原型和克隆实例的字段值,可以看到它们是相同的
        System.out.println(prototype.getField());
        System.out.println(cloned.getField());
    }
}

这个例子中,Prototype 类实现了 Cloneable 接口,重写了 clone 方法,使得可以通过原型实例快速复制出新的实例。在 Client 类中,我们可以看到,通过原型 prototype 创建出的新实例 cloned,其字段值与原型是相同的。这就是原型模式的基本使用。

请注意,Java 的 clone 方法默认是浅拷贝,如果你的原型类中有复杂的对象结构,可能需要自行实现深拷贝。

Last Updated: 2024/09/12 06:36:14
钉钉ngrok+自己的服务器内网穿透 九、建造者模式(Builder)
OωO 取消
  • |´・ω・)ノ
  • ヾ(≧∇≦*)ゝ
  • (☆ω☆)
  • (╯‵□′)
  •  ̄﹃ ̄
  • (/ω\)
  • →_→
  • (ノ°ο°)ノ
  • ⌇●﹏●⌇
  • (ฅ´ω`ฅ)
  • φ( ̄∇ ̄o)
  • ヾ(´・ ・`。)ノ"
  • (ó﹏ò。)
  • Σ(っ °Д °;)っ
  • ( ,,´・ω・)ノ
  • ╮(╯▽╰)╭
  • (。•ˇ‸ˇ•。)
  • >﹏<
  • ( ๑´•ω•)
  • "(´っω・`。)
  • "(ㆆᴗㆆ)