[设计模式Java实现附plantuml源码~创建型] 对象的克隆~原型模式

前言:
为什么之前写过Golang 版的设计模式,还在重新写Java 版?
答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。
为什么类图要附上uml
因为很多人学习有做笔记的习惯,如果单纯的只是放一张图片,那么学习者也只能复制一张图片,可复用性较低,附上uml,方便有新理解时,快速出新图。


🔥[设计模式Java实现附plantuml源码]专链

  1. 确保对象的唯一性~单例模式
  2. 集中式工厂的实现~简单工厂模式
  3. 多态工厂的实现——工厂方法模式
  4. 产品族的创建——抽象工厂模式
  5. 对象的克隆~原型模式

文章目录

    • 原型模式
      • 代码简单实现
      • 原型模式总结
        • 原型模式的主要优点如下:
        • 原型模式的主要缺点如下:
      • 适用场景

原型模式

在这里插入图片描述

@startuml

abstract class Prototype implements Cloneable {

- String name;

+ clone(): Prototype;

}

class ConcretePrototypeA extends Prototype {
	+ clone(): Prototype;
}

class ConcretePrototypeB extends Prototype {
	+ clone(): Prototype;
}

class Client{}

Client -up-> ConcretePrototypeA

@enduml

在原型模式结构图中包含以下3个角色。
(1)Prototype(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至还可以是具体实现类。
(2)ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
(3)Client(客户类):让一个原型对象克隆自身从而创建一个新的对象,在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。由于客户类针对抽象原型类Prototype编程,因此用户可以根据需要选择具体原型类,系统具有较好的可扩展性,增加或更换具体原型类都很方便。

代码简单实现

package create;

public class PrototypeTest {

    public static void main(String[] args)  {
        Prototype prototype = new Prototype();
        prototype.setName("hello");
        System.out.println(prototype);
        Prototype clone = prototype.clone();
        System.out.println(clone);
        System.out.println(prototype.getName());
        System.out.println(clone.getName());
    }

}

// 原型类
class Prototype implements Cloneable {

    private String name;

    public String getName() {
        return name;
    }

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

    @Override
    protected Prototype clone(){
        try {
            return ((Prototype) super.clone());
        } catch (CloneNotSupportedException ignored) {
            System.out.println("当前对象不支持拷贝");
        }
        return null;
    }
}

原型模式总结

注意深浅拷贝

原型模式的主要优点如下:

(1)当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过复制一个已有实例可以提高新实例的创建效率。
(2)扩展性较好。由于在原型模式中提供了抽象原型类,在客户端可以针对抽象原型类进行编程,而将具体原型类写在配置文件中,增加或减少具体原型类对原有系统都没有任何影响。
(3)原型模式提供了简化的创建结构。工厂方法模式常常需要有一个与产品类等级结构相同的工厂等级结构,而原型模式就不需要这样。原型模式中产品的复制是通过封装在原型类中的克隆方法实现的,无须专门的工厂类来创建产品。
(4)可以使用深克隆的方式保存对象的状态。使用原型模式将对象复制一份并将其状态保存起来,以便在需要的时候使用,例如恢复到某一历史状态,可辅助实现撤销操作。

原型模式的主要缺点如下:

(1)需要为每一个类配备一个克隆方法,而且该克隆方法位于一个类的内部。当对已有的类进行改造时,需要修改源代码,违背了开闭原则。
(2)在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重的嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来可能会比较麻烦。

适用场景

在以下情况下可以考虑使用原型模式:
(1)创建新对象成本较大(例如初始化需要占用较长的时间,占用太多的CPU资源或网络资源)。新的对象可以通过原型模式对已有对象进行复制来获得,如果是相似对象,则可以对其成员变量稍作修改。
(2)如果系统要保存对象的状态,而对象的状态变化很小,或者对象本身占用内存较少时,可以使用原型模式配合备忘录模式来实现。
(3)需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的几个组合状态。通过复制原型对象得到新实例可能比使用构造函数创建一个新实例更加方便。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

P4学习(六)实验三:a Control Plane using P4Runtime

目录 一. 实验目的二.阅读MyController.py文件1.导入P4Runtime的库2.main部分1. P4InfoHelper 实例化2. 创建交换机连接3. 设置主控制器4. 安装 P4 程序5. 写入隧道规则6. 读取表项和计数器(注释掉的部分)7. 定时打印隧道计数器8. 异常处理9. 关闭交换机…

Sqoop与Flume的集成:实时数据采集

将Sqoop与Flume集成是实现实时数据采集和传输的重要步骤之一。Sqoop用于将数据从关系型数据库导入到Hadoop生态系统中,而Flume用于数据流的实时采集、传输和处理。本文将深入探讨如何使用Sqoop与Flume集成,提供详细的步骤、示例代码和最佳实践&#xff0…

ThreeJS部件装配

1 父物体数据 父物体首先几何中心归于原点,然后测量出装配点1,其数据为(0.15,0.00,0.168); //父物体添加连接group为孩子 ParentObj.add(ParentLinkChildGroup); //设置连接group的位置&…

【上分日记】第381场周赛(差分 + 分类讨论)

前言 这次博主做了三道题,算是第一次,看来是题出的简单了(hhh,小白勿喷),不过还是有不错的进步,继续加油,这次最后一题分类讨论也是挺让人头疼的,下面我们好好总结一下。…

RPC和HTTP,它们之间到底啥关系

既然有 HTTP 请求,为什么还要用 RPC 调用? gPRC 为什么使用 HTTP/2 Spring Cloud 默认是微服务通过Restful API来进行互相调用各自微服务的方法,同时也支持集成第三方RPC框架(这里的说的RPC是特指在一个应用中调用另一个应用的接…

基于LLaMA Factory,单卡3小时训练专属大模型 Agent

大家好,今天给大家带来一篇 Agent 微调实战文章 Agent(智能体)是当今 LLM(大模型)应用的热门话题 [1],通过任务分解(task planning)、工具调用(tool using)和…

074:vue+mapbox 加载here地图(影像瓦片图 v2版)

第074个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载here地图的影像瓦片图 v2软件版本。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共77行)相关API参考:专栏目标示例效果

React16源码: React中的resetChildExpirationTime的源码实现

resetChildExpirationTime 1 )概述 在 completeUnitOfWork 当中,有一步比较重要的一个操作,就是重置 childExpirationTimechildExpirationTime 是非常重要的一个时间节点,它用来记录某一个节点的子树当中,目前优先级最…

链路聚合原理与配置

链路聚合原理 随着网络规模不断扩大,用户对骨干链路的带宽和可靠性提出了越来越高的要求。在传统技术中,常用更换高速率的接口板或更换支持高速率接口板的设备的方式来增加带宽,但这种方案需要付出高额的费用,而且不够灵活。采用…

网络安全全栈培训笔记(55-服务攻防-数据库安全RedisHadoopMysqla未授权访问RCE)

第54天 服务攻防-数据库安全&Redis&Hadoop&Mysqla&未授权访问&RCE 知识点: 1、服务攻防数据库类型安全 2、Redis&Hadoop&Mysql安全 3、Mysql-CVE-2012-2122漏洞 4、Hadoop-配置不当未授权三重奏&RCE漏洞 3、Redis-配置不当未授权…

eNSP学习——配置通过FTP进行文件操作

原理概述: FTP(File Transfer Protocol,文件传输协议)是在TCP/IP网络和Internet上最早使用的协议之一,在TCP/IP协议族中属于应用层协议,是文件传输的Internet标准。主要功能是向用户提供本地和远程主机…

RTDETR 引入 UniRepLKNet:用于音频、视频、点云、时间序列和图像识别的通用感知大卷积神经网络 | DRepConv

大卷积神经网络(ConvNets)近来受到了广泛研究关注,但存在两个未解决且需要进一步研究的关键问题。1)现有大卷积神经网络的架构主要遵循传统ConvNets或变压器的设计原则,而针对大卷积神经网络的架构设计仍未得到解决。2)随着变压器在多个领域的主导地位,有待研究ConvNets…

Leetcode—39.组合总和【中等】

2023每日刷题&#xff08;七十六&#xff09; Leetcode—39.组合总和 算法思想 实现代码 class Solution { public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {vector<vector<int>> ans;vector<int>…

Elasticsearch:介绍 kNN query,这是进行 kNN 搜索的专家方法

作者&#xff1a;来自 Elastic Mayya Sharipova, Benjamin Trent 当前状况&#xff1a;kNN 搜索作为顶层部分 Elasticsearch 中的 kNN 搜索被组织为搜索请求的顶层&#xff08;top level&#xff09;部分。 我们这样设计是为了&#xff1a; 无论分片数量多少&#xff0c;它总…

【学习】focal loss 损失函数

focal loss用于解决正负样本的不均衡情况 通常我们需要预测的正样本要少于负样本&#xff0c;正负样本分布不均衡会带来什么影响&#xff1f;主要是两个方面。 样本不均衡的话&#xff0c;训练是低效不充分的。因为困难的正样本数量较少&#xff0c;大部分时间都在学习没有用…

【linux】 查看 Linux 重启历史记录(reboot)

了解 Linux 重启日志 /var/log 目录隐藏着 Linux 日志机制的核心信息&#xff0c;它是记录系统活动的宝贵仓库。然而&#xff0c;仅仅有日志还不够&#xff0c;真正的难题在于&#xff0c;如何从大量数据中提炼出与系统重启相关的关键信息。 在 /var/log 目录中&#xff0c;可…

更改wpf原始默认按钮的样式

样式 代码 <Window x:Class"WpfApp4.Window1"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend/2008…

机械臂雅可比矩阵的矢量积理解和matlab实现

雅可比矩阵的第Ji列&#xff1a; 关于一些基本概念可以参考博客&#xff0c;部分细节如下&#xff1a; 每个移动关节&#xff0c;Ji可以这样计算&#xff1a; 每个旋转关节&#xff0c;Ji这样计算&#xff1a; 有时候要求按照末端执行器坐标系{n}来执行一些位移旋转之类的…

【QT+QGIS跨平台编译】之六:【LZMA+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、lzma介绍二、文件下载三、文件分析四、pro文件五、编译实践 一、lzma介绍 LZMA&#xff08;Lempel-Ziv-Markov chain-Algorithm的缩写&#xff09;&#xff0c;是一个Deflate和LZ77算法改良和优化后的压缩算法。 libLzma是基于LZMA压缩算法封装的开源库。2001年被…

如何用AirServer进行手机投屏?,Airserver 永久激活注册码

AirServer一款投屏神器&#xff0c;可以帮你轻松地将iPhone、iPad投屏到Mac。是不是经常看到游戏主播用AirServer投屏&#xff1f;此外&#xff0c;AirServer也是视频Up主必备工具之一&#xff01;用来录制演示教程不错。除了实现单个手机投屏到电脑或荧幕。如果你有多画面投屏…