【设计模式系列】原型模式(十一)

一、什么是原型模式

原型模式(Prototype Pattern)是一种创建型设计模式,它使得一个对象可以复制自身,从而创建一个与自己属性一致的新对象,而无需知晓对象创建的细节。++这种模式允许动态地增加对象的数量,并通过复制现有的对象来提高效率,特别是当直接创建对象的代价较大时++(例如,涉及复杂的初始化过程)。

二、原型模式的角色

  • Prototype(原型角色) :这
    • 是一个抽象类或接口,它声明了一个克隆自身的方法(通常是clone)。在Java中,这通常是通过实现Cloneable接口并覆盖Object类的clone方法来实现的。
  • ConcretePrototype(具体原型角色)
    • 这是Prototype角色的具体实现,它实现了克隆方法,以创建自身的副本。

三、角色模式的典型应用

  1. 实现对象池:在需要频繁创建和销毁对象的场景中,如数据库连接池或线程池,原型模式可以用来快速复制对象,减少创建和销毁的开销。

  2. 深拷贝和浅拷贝:原型模式可以实现对象的深拷贝(复制对象及其所有引用的对象)和浅拷贝(仅复制对象本身),这在需要复制对象图时非常有用。

四、原型模式在Object对象中的应用

以下是原型模式在Object对象中的具体应用:

  1. Cloneable接口

    • Cloneable是一个标记接口,没有任何方法,它用来指示一个类的对象是"可克隆"的。当一个类实现了Cloneable接口,它承诺该类的对象可以被克隆。
  2. Object类的clone()方法

    • Object类中的clone()方法是protected的,这意味着只有该类及其子类可以调用此方法。这个方法返回对象的一个副本,但是默认实现只是简单地返回对象的引用,而不是真正的副本。
  3. 实现克隆

    • 要使用clone()方法来复制对象,子类需要实现Cloneable接口,并重写clone()方法,以提供创建对象副本的具体实现。

以下是一个简单的示例,展示了如何在Java中使用Object类的clone()方法来实现原型模式:

java 复制代码
// 1. 实现Cloneable接口
public class Sheep implements Cloneable {
    private String name;

    public Sheep(String name) {
        this.name = name;
    }

    // 2. 重写clone()方法
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

// 使用原型模式
public class PrototypeTest {
    public static void main(String[] args) {
        try {
            Sheep original = new Sheep("Original");
            Sheep cloned = (Sheep) original.clone(); // 3. 调用clone()方法
            System.out.println("Original: " + original.getName());
            System.out.println("Cloned: " + cloned.getName());
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,Sheep类实现了Cloneable接口,并重写了Object类的clone()方法,以创建对象的副本。在main方法中,我们创建了一个Sheep对象,并使用clone()方法来复制这个对象。由于clone()方法是protected的,所以它只能在Sheep类或其子类中被调用。

需要注意的是,Object类的clone()方法只能实现浅拷贝,即只复制对象本身和它的所有成员变量,如果成员变量是引用类型,则复制的是引用,而不是引用对象本身。如果需要实现深拷贝,需要在子类中自定义克隆逻辑。

相关推荐
yaoxin5211239 分钟前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
灰子学技术2 小时前
Envoy 使用的设计模式技术文档
设计模式
极客先躯2 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图
用户60648767188962 小时前
AI 抢不走的技能:用 Claude API 构建自动化工作流实战
java
我命由我123452 小时前
Kotlin 开发 - lateinit 关键字
android·java·开发语言·kotlin·android studio·android-studio·android runtime
aXin_ya2 小时前
微服务第八天 Sentinel 四种分布式事务模式
java·数据库·微服务
Halo_tjn3 小时前
Java Set集合相关知识点
java·开发语言·算法
Linsk3 小时前
Java和JavaScript的关系真是雷峰和雷峰塔的关系吗?
java·javascript·oracle
许彰午3 小时前
我手写了一个 Java 内存数据库(二):B+ 树的插入与分裂
java·开发语言·面试
zhouwy1133 小时前
Java 快速入门笔记:从基础语法到 Spring Boot 实战
java