9【原型模式】复制一个已存在的对象来创建新的对象

news2024/11/16 15:28:13

你好,我是程序员雪球。

今天我们来学习23种设计模式之原型模式,在平时开发过程中比较少见。我带你了解什么是原型模式,使用场景有哪些?有什么注意事项?深拷贝与浅拷贝的区别,最后用代码实现一个简单的示例。

 90dd0da65e7d4a4890f42ca65050befb.png

 

一、是什么?

原型模式是一种创建对象的模式,它通过复制一个已存在的对象来创建新的对象,而不是通过传统的 new 操作符来创建对象。这种模式的主要目的是提高创建对象的效率和性能,尤其是在需要创建大量相似对象的情况下。

 

二、使用场景:

 

- 当创建对象的过程比较复杂或耗时较长时,使用原型模式可以提高创建对象的效率。

- 当需要创建大量相似对象时,使用原型模式可以减少内存的开销。

- 当需要动态地创建对象时,使用原型模式可以方便地实现对象的复制和修改。

 

三、注意事项

 

- 在使用原型模式时,需要注意深拷贝和浅拷贝的区别。浅拷贝只复制对象的引用,而不复制对象的内容,因此在修改原始对象时,复制对象也会受到影响。深拷贝则会复制对象的所有内容,包括嵌套对象,因此在修改原始对象时,复制对象不会受到影响。

 

- 在使用原型模式时,需要注意对象的创建和销毁。由于原型模式通过复制对象来创建新对象,因此需要确保原始对象在不再需要时被正确地销毁,以释放内存资源。

 

四、代码示例

接下来让我们用 Java 来实现一个简单的示例吧。

 

 

public class PrototypePattern {

    public static void main(String[] args) {

        PrototypePrototype obj1 = new PrototypePrototype("Apple");

        PrototypePrototype obj2 = obj1.clone();

 

        // 修改 obj2 的属性

        obj2.setName("Banana");

 

        // 输出 obj1 和 obj2 的属性

        System.out.println(obj1.getName());

        System.out.println(obj2.getName());

    }

}

 

class PrototypePrototype implements Cloneable {

    private String name;

 

    public PrototypePrototype(String name) {

        this.name = name;

    }

 

    // 获取对象的克隆

    public Object clone() throws CloneNotSupportedException {

        return super.clone();

    }

 

    // 获取对象的名称

    public String getName() {

        return name;

    }

 

    // 设置对象的名称

    public void setName(String name) {

        this.name = name;

    }

}

 

 

在上面的示例中,我们定义了一个 PrototypePrototype 类,它实现了 Cloneable 接口,并重写了 clone() 方法。在 PrototypePrototype 类中,我们有一个私有成员变量 name,用于存储对象的名称。我们还提供了 getName() 和 setName() 方法,用于获取和设置对象的名称。

 

在 main() 方法中,我们创建了两个 PrototypePrototype 对象 obj1 和 obj2。我们使用 obj1.clone() 方法来创建 obj2,这将返回一个与 obj1 完全相同的副本。然后,我们修改 obj2 的名称,并输出 obj1 和 obj2 的名称。

 

通过使用原型模式,我们可以通过复制已存在的对象来创建新的对象,而不必每次都重新创建对象。这样可以提高创建对象的效率和性能,尤其是在需要创建大量相似对象的情况下。

 

总结

dda33a724fc54c2494f256e5b4a10df2.png

 

一、是什么?

原型模式通过复制一个已存在的对象来创建新的对象,而不是通过传统的 new 操作符来创建对象。这样可以提高创建对象的效率和性能,尤其是在需要创建大量相似对象的情况下。

二、使用场景:

1、创建比较耗时的对象场景;

2、创建大量相似对象场景;

3、动态创建对象场景;

三、注意事项:

1、浅拷贝只复制对象的引用,而不复制对象的内容,因此在修改原始对象时,复制对象也会受到影响。

2、深拷贝则会复制对象的所有内容,包括嵌套对象,因此在修改原始对象时,复制对象不会受到影响。

3、在使用原型模式时,需要注意对象的创建和销毁。

 

想要了解更多设计模式相关知识,请关注我吧,下期持续更新。

 

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

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

相关文章

机器学习-随机森林温度预测模型优化

文章目录 前言旧模型训练新模型训练参数查看组合参数训练学习模型评估 前言 在机器学习-随机森林算法预测温度一文中,通过增大模型训练数据集和训练特征的方式去优化模型的性能,本文将记录第三方种优化方式,通过调整随机森林创建模型参数的方…

专业照片编辑软件ON1 Photo RAW 2024 mac/win

ON1 Photo RAW 2024 for Mac是一款集专业性与易用性于一体的照片编辑软件。它拥有简洁直观的用户界面,即便对于摄影新手,也能快速上手。软件支持RAW格式照片处理,能够完整保留照片原始信息,让后期调整更加灵活。 在功能方面&#…

[Linux][基础IO][一][系统文件IO][文件描述符fd]详细解读

目录 0.预备知识1.系统文件I/O1.open2.write/read/close/lseek 2.文件描述符fd1.[0 & 1 & 2]2.什么是文件描述符?3.文件描述符的分配规则4.重定向5.使用dup2系统调用 -- 完成重定向6.FILE 0.预备知识 什么叫做文件呢? 站在系统的角度&#xff0…

【全网独家】oceanbase容器重启时报obshell failed错误,无法正常启动的问题处理

正常运行的oceanbase容器,重新启动该容器却启动不了,重启服务器也无法恢复,报obshell failed错误,无法正常启动,本文记录了问题处理过程。 一、问题现象 1、正常运行的oceanbase容器,重启却启动不了 2、运…

CSS中:root伪类的说明和使用

定义和用法 :root选择器用匹配文档的根元素。在HTML中根元素始终是HTML元素,所以也可以把:root理解为html根元素选择器,但是比html根元素的优先级高,:root伪类选择器常常被用于定义全局的CSS变量或者设置全局的CSS样式。CSS :root 选择器 | …

Win11 WSL2 install Ubuntu20.04 and Seismic Unix

Win11系统,先启用或关闭Windows功能,勾选“适用于Linux的Windows子系统”和“虚拟机平台”两项 设置wsl默认版本为wsl2,并更新 wsl --list --verbose # 查看安装版本及内容 wsl --set-default-version 2 # 设置wsl默认版本为wsl2 # 已安装…

Go微服务: go-micro集成consul的注册中心和配置中心

微服务与注册中心的关系图 这个图很好说明了微服务之间的关系,以及consul注册中心的重要性 环境准备 1 )consul 集群 假设consul 集群已经搭建,已有5台server和2台client这里2台client被nginx做负载均衡,假设最终本地的访问地址…

rocketmq和rabbitmq总是分不清?

1. 官方解答 摘自百度搜索: 2. 通俗易懂的回答

蓝桥杯:握手问题和小球反弹问题

试题 A: 握手问题 本题总分: 5 分 【问题描述】 小蓝组织了一场算法交流会议,总共有 50 人参加了本次会议。在会议上, 大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手(且仅有一次&#x…

Hadoop概述及集群搭建

文章目录 一、Hadoop介绍二、Hadoop发展简史三、Hadoop核心组件四、Hadoop架构变迁1、Hadoop 1.02、Hadoop 2.03、Hadoop 3.0 五、Hadoop集群简介六、Hadoop部署模式七、Hadoop 集群搭建第一步:创建虚拟机第二步:安装Linux镜像第三步:网络配置…

Spring Cloud 集成 RabbitMQ

目录 前言步骤引入相关maven依赖添加相关配置 使用方法配置消息序列化创建第一个消息队列和交换机使用方法 总结 前言 在当今的微服务架构盛行的时代,消息队列作为一种重要的通信机制,在分布式系统中扮演着不可或缺的角色。RabbitMQ,作为一款…

(七)C++自制植物大战僵尸游戏关卡数据加载代码讲解

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/xjvbb 打开LevelData.h和LevelData.cpp文件。文件位置如下图所示。 LevelData.h 此头文件中定义了两个类,分别是OpenLevelData、LevelData,其中OpenLevelData用于加载文件数据。LevelData解析数据…

ansible创建用户账户和更新ansible库的密钥

1.创建⽤户帐户 从 http://materials/user_list.yml 下载要创建的⽤户的列表,并将它保存到 /home/greg/ansible 在本次考试中使⽤在其他位置创建的密码库 /home/greg/ansible/locker.yml 。创建名为 /home/greg/ansible/users.yml 的 playbook ,从⽽…

攻防世界13-simple_php

13-simple_php <?php show_source(*__FILE__*);//高亮文件 include("config.php");//文件包含在内 $a$_GET[a];//获得a $b$_GET[b];//获得b if($a0 and $a){ //判断a是否满足条件echo $flag1; //满足就输出flag1 } if(is_numeric($b)){ //判断b的条件&#x…

解决方案ImportError: cannot import name ‘BertTokenizerFast‘ from ‘transformers‘

文章目录 一、现象二、解决方案 一、现象 从transformers 库调用该包的时候 from transformers import BertTokenizer, AdamW, BertTokenizerFast报错显示 ImportError: cannot import name ‘BertTokenizerFast’ from ‘transformers’ 二、解决方案 追溯查看transforme…

【OpenGL开发】PyQt在关闭应用程序时没有运行析构函数的问题

PyQt在关闭应用程序时没有运行析构函数的问题 目录 一、说明二、python的析构函数三、QT5 存在一些问题四、PyQt5 存在一些问题五、OpenGL的析构问题 一、说明 应用QT做程序界面&#xff0c;在程序退出的时候&#xff0c;需要调用析构函数释放资源&#xff0c;这个操作在Pytho…

跟TED演讲学英文:Why AI is incredibly smart and shockingly stupid by Yejin Choi

Why AI is incredibly smart and shockingly stupid Link: https://www.ted.com/talks/yejin_choi_why_ai_is_incredibly_smart_and_shockingly_stupid Speaker: Yejin Choi Date: April 2023 文章目录 Why AI is incredibly smart and shockingly stupidIntroductionVocabul…

通过调用Vcenter-Api获取Vcenter中服务器信息

通过调用Vcenter-Api获取Vcenter中服务器信息 文章目录 通过调用Vcenter-Api获取Vcenter中服务器信息1. 获取Vmware API帮助文档2. 获取访问凭证3. 获取服务器清单4. 获取服务器更多信息5. 获取虚机更多信息6. 获取磁盘信息7. 获取操作系统相关 1. 获取Vmware API帮助文档 htt…

面试八股——Spring——AOP与事务

AOP的定义 事务的实现 事务的失效场景 异常捕获处理 下图中由于②导致异常&#xff1a; 原因&#xff1a; 解决办法&#xff1a;自己抛出一个非检查异常&#xff08;具体原因看“抛出检查异常”&#xff09;。 抛出检查异常 由于①出错&#xff0c;导致抛出了检查异常 原因&…

[linux api] of_irq_init

总结: 以如下级联的中断控制器为例: of_irq_init会确保先初始化父控制器再初始化子控制器,也即整体按照层序遍历的顺序进行初始化,以上图为例,其初始化顺序为: intc0intc1-2intc3-6具体实现则分为两个阶段: 第一阶段 遍历所有设备节点,并与参数matches进行匹配,找…