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

news2024/11/24 19:24:31

一、什么是原型模式

原型模式(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()方法来实现原型模式:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2234569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

h5web浏览器获取腾讯地图经纬度

https://lbs.qq.com/dev/console/application/mine 去腾讯地图申请key 然后前端页面引用 <script type"text/javascript" src"https://apis.map.qq.com/tools/geolocation/min?key自己的key&referertest"></script>调用代码 let geoloca…

微积分复习笔记 Calculus Volume 1 - 4.6 | Limits at Infinity and Asymptotes

4.6 Limits at Infinity and Asymptotes - Calculus Volume 1 | OpenStax

开源的flash浏览器 CelfFlashBrowser

特点 不用安装flash就可以玩flash游戏。 可播放在线和本地的swf文件 下载地址 &#xff1a;https://github.com/Mzying2001/CefFlashBrowser

游戏引擎中的颜色科学

游戏引擎中的渲染组件的作用是生成一个二维图片&#xff0c;在特定的时间从给定的视点观察的方向看到的一个三维空间的状态。他们的生成每一张图片都会被称为帧&#xff0c;他们生成的速度称为帧率。 像素 在每一帧中&#xff0c;游戏引擎的视觉输出基本上是一大堆彩色像素&a…

css中pointer-events:none属性对div里面元素的鼠标事件的影响

文章目录 前倾提要当没有设置属性pointer-events时候结果 当子元素设置了pointer-events: none修改后的代码结果如下所示 当父元素设置了pointer-events: none若两个div同级也就是兄弟级 前倾提要 在gis三维开发的地图组件上放一个背景图片&#xff0c;左右两侧的颜色渐变等&a…

中科蓝汛GPIO操作说明

概述 本篇文章介绍如何使用中科蓝汛AB5681&#xff0c;GPIO管脚使用说明。 一、第一种写法 1&#xff09;、GPIO配置输入模式 //内部上拉 GPIOBDE | BIT(4); //数字IO使能: 0为模拟IO, 1 为数字IO GPIOBDIR | BIT(4); //控制IO的方向: 0为输出, 1为输入. GPIOBFEN &…

Kotlin 协程使用及其详解

Kotlin协程&#xff0c;好用&#xff0c;但是上限挺高的&#xff0c;我一直感觉自己就处于会用&#xff0c;知其然不知其所以然的地步。 做点小总结&#xff0c;比较浅显。后面自己再继续补充吧。 一、什么是协程&#xff1f; Kotlin 协程是一种轻量级的并发编程方式&#x…

LabVIEW 离心泵机组故障诊断系统

开发了一套基于LabVIEW图形化编程语言设计的离心泵机组故障诊断系统。系统利用先进的数据采集技术和故障诊断方法&#xff0c;通过远程在线监测与分析&#xff0c;有效提升了离心泵的预测性维护能力&#xff0c;保证了石油化工生产的连续性和安全性。 项目背景及意义 离心泵作…

线程函数和线程启动的几种不同形式

线程函数和线程启动的几种不同形式 在C中&#xff0c;线程函数和线程启动可以通过多种形式实现。以下是几种常见的形式&#xff0c;并附有相应的示例代码。 1. 使用函数指针启动线程 最基本的方式是使用函数指针来启动线程。 示例代码&#xff1a; #include <iostream&g…

辐射传输方程的分解

Decomposition of the Boundary Value Problem for Radiative Transfer Equation of MODIS and MISR instruments 0.Notions Let L L L be the straming-collision operator, and S S S is scattering operator: L I Ω ⋅ ∇ I ( r , Ω ) σ ( r , Ω ) I ( r , Ω ) S…

智会智展,活动必备

智会智展 APP 各大应用市场均可下载统一链接https://m.malink.cn/s/r6nQVf

Hive操作库、操作表及数据仓库的简单介绍

数据仓库和数据库 数据库和数仓区别 数据库与数据仓库的区别实际讲的是OLTP与OLAP的区别 操作型处理(数据库)&#xff0c;叫联机事务处理OLTP&#xff08;On-Line Transaction Processing&#xff09;&#xff0c;也可以称面向用户交易的处理系统&#xff0c;它是针对具体业务…

如何选择适合小团队的项目管理工具?免费与开源软件推荐

目录 一、小团队项目管理工具的重要性 二、热门项目管理工具介绍 &#xff08;一&#xff09;禅道 &#xff08;二&#xff09;Trello &#xff08;三&#xff09;Asana &#xff08;四&#xff09;JIRA 三、免费项目管理软件推荐 &#xff08;一&#xff09;ES 管理器 …

kafka如何获取 topic 主题的列表?

大家好&#xff0c;我是锋哥。今天分享关于【kafka如何获取 topic 主题的列表&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka如何获取 topic 主题的列表&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Kafka中&#xff0c;可以…

Maven详解—(详解Maven,包括Maven依赖管理以及声明周期,Maven仓库、idea集成Maven)

文章目录 Maven详解一.初始Maven1.1 概述1.2 作用 二.Maven模型2.1 概述2.2 构建生命周期/阶段2.3 项目对象模型2.4 依赖管理模型 三.Maven仓库四.Maven安装4.1 下载4.2 安装步骤 五.Idea集成Maven Maven详解 一.初始Maven 1.1 概述 Maven是Apache旗下的一个开源项目&#x…

虚拟滚动 - 从基本实现到 Angular CDK

简介 在大数据列表的处理上&#xff0c;虚拟滚动是一种优化性能的有效方式。本篇文章将详细介绍两种常见的虚拟滚动实现方式&#xff1a;使用 transform 属性和 Intersection Observer。重点讲解如何通过 transform 属性实现高效的虚拟滚动&#xff0c;并对比Angular CDK中的实…

Spring Boot 配置文件启动加载顺序

前言 Spring Boot的启动加载顺序是一个涉及多个步骤和组件的过程。Spring Boot通过一系列默认设置简化了应用程序的配置&#xff0c;使得开发者能够快速地搭建和部署应用。为了实现这一目标&#xff0c;Spring Boot采用了一种分层和优先级机制来加载配置文件。 一、Spring Bo…

C# Modbus RTU通讯回顾

涉及技术&#xff1a; 1.使用NMdbus4 库 2.ushort[]转int 记得之前刚学习的时候&#xff0c;是ushort[] → Hex字符串→byte[] → 翻转byte[] →BitConverter.ToInt32()&#xff0c;饶了一大圈&#xff1b;实际上可以直接转&#xff1b;这里也有小细节&#xff1a;使用BitCo…

HFSS学习笔记(五)金属过孔、复制模型带激励等问题(持续更新...)

HFSS学习笔记&#xff08;五&#xff09;金属过孔、复制模型带激励等问题&#xff08;持续更新…&#xff09; 一、金属过孔设计 方法一&#xff1a;用介质减去金属圆柱体&#xff0c;然后再添加金属圆柱体 方法二&#xff1a;嵌入金属圆柱 圆柱过孔选择材料为“copper” HFS…

Late Chunking×Milvus:如何提高RAG准确率

01. 背景 在RAG应用开发中&#xff0c;第一步就是对于文档进行chunking&#xff08;分块&#xff09;&#xff0c;高效的文档分块&#xff0c;可以有效的提高后续的召回内容的准确性。而对于如何高效的分块是个讨论的热点&#xff0c;有诸如固定大小分块&#xff0c;随机大小分…