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

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


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

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

文章目录

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

原型模式

在这里插入图片描述

@startumlabstract 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;}@Overrideprotected 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)需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的几个组合状态。通过复制原型对象得到新实例可能比使用构造函数创建一个新实例更加方便。

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

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

相关文章

07章【常用类库API】

字符串操作 String类 String可以表示一个字符串。String类实际是使用字符数组存储的。 String类的两种赋值方式: 一种称为直接赋值: String name “小白” 通过关键字new调用String的构造方法赋值 String name new String(“小白”)String类的两…

c++学习理解之路——基类指针指向子类

参考:基类指针指向子类对象_基类指针可以指向子类-CSDN博客 笔记(基于自己的理解,欢迎讨论) 基类指针对象只存储跟基类中的成员函数、成员对象相关信息,子类指针对象存储了子类和基类中的信息。按道理来说&#xff0c…

【Github】作为程序员不得不知道的几款Github加速神器

背景 众所周知,近几年国内用户在访问Github时,经常间歇性无法访问Github。 接下来推荐几款 作为程序员不得不知道的Github加速神器。 推荐1:FastGithub FastGithub是一款Github加速神器,解决github打不开、用户头像无法加载、r…

【数据结构和算法】--- 二叉树(3)--二叉树链式结构的实现(1)

目录 一、二叉树的创建(伪)二、二叉树的遍历2.1 前序遍历2.2 中序遍历2.3 后序遍历 三、二叉树节点个数及高度3.1 二叉树节点个数3.2 二叉树叶子节点个数3.3二叉树第k层节点个数3.4 二叉树查找值为x的节点 四、二叉树的创建(真) 一、二叉树的创建(伪) 在学习二叉树的基本操作前…

使用Python基于metricbeat和heartbeat采集数据进行告警

一、系统架构 IP主机名角色备注11.0.1.11kafka1kafka和MySQL11.0.1.12kafka2kafka11.0.1.13kafka3kafka11.0.1.14demo1metricbeat和heartbeat 二、部署Kafka 省略 二、部署Metricbeat和Heartbeat metricbeat配置: metricbeat.config.modules:path: ${path.confi…

电商铺货上货接口API实现无货源上货(1688/淘宝/京东/拼多多)

获取商品列表接口 item_search 获取商品详情页数据接口 item_get 1688.item_get 公共参数 获取API测试权限和地址 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包…

Unity Text超框 文字滚动循环显示

Unity Text超框 文字滚动循环显示 //container Text using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine; using UnityEngine.UI;public class AutoScrollText : MonoBehaviour {private Text[] _texts new Text[…

MATLAB字符串编辑常用代码

1.字符串赋值 % 字符串赋值 sabcdefg 2.字符串属性和操作 (1)获取字符串长度 sabcdefg;% 字符串赋值 length(a) % 获取字符串长度 (2)连接字符串 % 连接两个字符串,每个字符串最右边的空格被裁切 s1a s2b s3strcat(s1,s2) 3.字符串比较 % strcmp 比较两个字符串是…

251.【2023年华为OD机试真题(C卷)】5G网络建设(最小生成树算法-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-5G网络建设二.解题思路三.题解代码Python题解代…

9. UE5 RPG创建UI(下)

在上一篇文章里,制作了显示血量和蓝量的ui,并且还将ui和获取数据使用的控制器层创建出来并初始化成功。现在只有主用户控件上面被添加了控制器层,还未给每个用户控件赋予控制器层。接下来要实现对属性的广播功能,在属性值变化的时…

【Effective C++】4. 设计与声明

Item22 将成员变量声明为private 有以下几个优势: 1. 语法一致性:访问class成员时每一个都是函数,不需要记住是否需要小括号 2. 使成员变量的处理有更精准的控制 class AccessLevels { public:int getReadOnly() const { return readOnly…

【issue-halcon例程学习】fuzzy_measure_pin.hdev

例程功能 检查IC的引线宽度和引线距离。 代码如下 dev_close_window () read_image (Image, board/board-06) get_image_size (Image, Width, Height) dev_open_window (0, 0, Width, Height, black, WindowHandle) * * --- Fuzzy Measure: Row1 : 305.5 Col1 : 375.5 Phi1 …

电商平台接口自动化测试脚本编写规范与实践

随着电商业务的快速发展,电商平台接口的稳定性和可靠性变得越来越重要。为了提高测试效率和保证接口质量,越来越多的企业开始采用自动化测试技术。本文将介绍电商平台接口自动化测试脚本的编写规范与实践,并给出相应的代码示例。 一、编写规…

gitlab.rb主要配置

根据是否docker安装,进入挂载目录或安装目录 修改此文件,我一般是在可视化窗口中修改,有时候也在命令行手敲 将下面的配置复制到该文件中 external_url http://192.168.100.50 # nginx[listen_port] = 8000 (docker安装的这一行不需要,因为端口映射导致此处修改会导致访问…

六使用Maven插件构建Docker镜像

使用Maven插件构建Docker镜像 我们知道,Maven是一个强大的项目管理与构建工具。如果可以使用Maven构建Docker镜像,那么我们的工作就能得到进一步的简化。 经过调研,以下几款Maven的Docker插件进入笔者视野,如表13-1所示。 插件…

C语言学习(3)—— 函数

C语言不支持函数重载 一、函数的使用方法 1. 直接使用 &#xff08;1&#xff09;定义的函数在main函数 之上 #include<stdio.h> int sum(int num1, int num2){int res 0;res num1 num2;return res; }int main(){int res sum(2, 3);printf("%d", res…

大数据学习之Flink、搞懂Flink的恢复策略

第一章、Flink的容错机制 第二章、Flink核心组件和工作原理 第三章、Flink的恢复策略 第四章、Flink容错机制的注意事项 第五章、Flink的容错机制与其他框架的容错机制相比较 目录 第三章、Flink的恢复策略 Ⅰ、恢复策略 1. Checkpoint&#xff1a; 2. Savepoint&#…

Sentinel降级操作

1.通过对feign调用的降级 如果访问失败&#xff0c;则返回另外的信息 正常的feign调用 FeignClient(value "gulimall-seckill",fallback SeckillFeignServiceFallback.class) public interface SeckillFeignService {/*** 写给商品服务的接口&#xff0c;查询秒杀…

2024茶饮品牌如何出圈,媒介盒子分析

随着新式茶饮的消费场景更加多元化&#xff0c;品类不断拓宽&#xff0c;消费者对新式茶饮的热情也是只增不减。居民可支配收入水平不断上升&#xff0c;居民消费升级为新式茶饮的发展也提供了良好基础&#xff0c;今天媒介盒子就来和大家聊聊&#xff1a;2024茶饮品牌如何出圈…

win10系统 pdf 文件无法正常预览

网上也看了不少办法&#xff0c;修改注册表什么的&#xff0c;太麻烦了&#xff0c;尝试了一下下载Adobe Acrobat Reader&#xff0c;安装后就可以成功预览显示啦&#xff01;对&#xff0c;就是这么简单&#xff01;Adobe Acrobat Reader下载链接&#xff1a;link