《JAVA与模式》之原型模式

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、原型模式的结构
  • 二、简单形式的原型模式
  • 三、登记形式的原型模式
  • 四、克隆满足的条件
  • 五、浅克隆和深克隆


前言

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
在这里插入图片描述
在阎宏博士的《JAVA与模式》一书中开头是这样描述原型(Prototype)模式的:

原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。这就是选型模式的用意。


一、原型模式的结构

原型模式要求对象实现一个可以“克隆”自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例。这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再去通过new来创建。

原型模式有两种表现形式:(1)简单形式、(2)登记形式,这两种表现形式仅仅是原型模式的不同实现。

二、简单形式的原型模式

在这里插入图片描述
 这种形式涉及到三个角色:

(1)客户(Client)角色:客户类提出创建对象的请求。

(2)抽象原型(Prototype)角色:这是一个抽象角色,通常由一个Java接口或Java抽象类实现。此角色给出所有的具体原型类所需的接口。

(3)具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。
抽象原型角色

public interface Prototype{/*** 克隆自身的方法* @return 一个从自身克隆出来的对象*/public Object clone();
}

具体原型角色

public class ConcretePrototype1 implements Prototype {public Prototype clone(){//最简单的克隆,新建一个自身对象,由于没有属性就不再复制值了Prototype prototype = new ConcretePrototype1();return prototype;}
}
public class ConcretePrototype2 implements Prototype {public Prototype clone(){//最简单的克隆,新建一个自身对象,由于没有属性就不再复制值了Prototype prototype = new ConcretePrototype2();return prototype;}
}

客户端角色

public class Client {/*** 持有需要使用的原型接口对象*/private Prototype prototype;/*** 构造方法,传入需要使用的原型接口对象*/public Client(Prototype prototype){this.prototype = prototype;}public void operation(Prototype example){//需要创建原型接口的对象Prototype copyPrototype = prototype.clone();}
}

三、登记形式的原型模式

在这里插入图片描述  作为原型模式的第二种形式,它多了一个原型管理器(PrototypeManager)角色,该角色的作用是:创建具体原型类的对象,并记录每一个被创建的对象。
抽象原型角色

public interface Prototype{public Prototype clone();public String getName();public void setName(String name);
}

具体原型角色

public class ConcretePrototype1 implements Prototype {private String name;public Prototype clone(){ConcretePrototype1 prototype = new ConcretePrototype1();prototype.setName(this.name);return prototype;}public String toString(){return "Now in Prototype1 , name = " + this.name;}@Overridepublic String getName() {return name;}@Overridepublic void setName(String name) {this.name = name;}
}
public class ConcretePrototype2 implements Prototype {private String name;public Prototype clone(){ConcretePrototype2 prototype = new ConcretePrototype2();prototype.setName(this.name);return prototype;}public String toString(){return "Now in Prototype2 , name = " + this.name;}@Overridepublic String getName

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

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

相关文章

初识kubernetes

Kubernetes核心概念 Master Master节点主要负责资源调度(Scheduler),控制副本(Replication Controller),和提供统一访问集群的入口(API Server)。---核心节点也是管理节点 Node Node是Kubernetes集群架构中运行Pod的服务节点(亦叫agent或min…

北京碳中和经营许可证办理条件及流程与我们的专业服务

各位老板好,随着全球气候变化问题的日益严重,碳中和成为了企业社会责任和可持续发展的关键一环。在北京,越来越多的企业开始关注并投入到碳中和的行列中。为了规范市场秩序,确保碳中和活动的合法性和有效性,北京地区实…

Splitpanes拆分窗格插件使用

目录 基本用法 纵向排列 遍历渲染 动态拆分宽度 项目开发中用到了拆分窗格(就是下面的效果,可以拆分网页,我们项目通常都是用左右两块拆分,可以通过拖动图标进行左右拖动),于是就发现了一个很好用的插件:Splitpane…

Day37:安全开发-JavaEE应用JNDI注入RMI服务LDAP服务JDK绕过调用链类

目录 JNDI注入-RMI&LDAP服务 JNDI远程调用-JNDI-Injection JNDI远程调用-marshalsec JNDI-Injection & marshalsec 实现原理 JNDI注入-FastJson漏洞结合 JNDI注入-JDK高版本注入绕过 思维导图 Java知识点: 功能:数据库操作,文…

一款好用的AI工具——边界AICHAT(三)

目录 3.23、文档生成PPT演示3.24、AI文档翻译3.25、AI翻译3.26、论文模式3.27、文章批改3.28、文章纠正3.29、写作助手3.30、文言文翻译3.31、日报周报月报生成器3.32、OCR-DOC办公文档识别3.33、AI真人语音合成3.34、录音音频总结3.35、域方模型市场3.36、模型创建3.37、社区交…

每日汇评:如果支撑位守住2145美元,黄金可能反弹至纪录高位

金价在周二因美国CPI数据火爆而暴跌后保持稳定; 美元和美债收益率在美元/日元下跌中暂停反弹; 随着美国CPI的出炉,市场焦点转向周四的零售销售和PPI数据; 金价在2160美元附近盘整,周二从2195美元的纪录高位回调约1%。由…

白嫖AWS云服务器,验证、注册指南

背景 不知道你想不想拥有一台属于自己的云服务器呢,拥有一台自己的云服务器可以建站,可以在上面搭建个人博客,今天我就来教大家如何申请亚马逊 AWS 免费云服务器,这个云服务器可以长达12个月的免费。而且到期后可以继续换个账号继…

【阿里云系列】-基于云效构建部署NodeJS项目到ACK

准备工作 01、编写Dockerfile文件可以根据不同的环境,新建不同的Dockerfile文件,比如Dockerfile-PROD # Deliver the dist folder with NginxFROM nginx:stable-alpine ENV LANGC.UTF-8 ENV TZAsia/ShanghaiCOPY dist/ /usr/share/nginx/html COPY ngi…

react的diff源码

react 的 render 阶段,其中 begin 时会调用 reconcileChildren 函数, reconcileChildren 中做的事情就是 react 知名的 diff 过程 diff 算法介绍 react 的每次更新,都会将新的 ReactElement 内容与旧的 fiber 树作对比,比较出它们…

【算法积累】辗转相除法

【算法积累】辗转相除法,python实现两种 辗转相除法(又称欧几里得算法)减法(不常用)代码实现执行结果 辗转相除法代码实现执行结果 辗转相除法(又称欧几里得算法) 又称欧几里得算法&#xff0c…

【洛谷 P8781】[蓝桥杯 2022 省 B] 修剪灌木 题解(数学)

[蓝桥杯 2022 省 B] 修剪灌木 题目描述 爱丽丝要完成一项修剪灌木的工作。 有 N N N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌木,让灌木的高度变为 0 0 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木…

镭速教你如何解决大数据量串行处理的问题

大数据的高效处理成为企业发展的关键。然而,大数据量串行处理的问题常常困扰着许多企业,尤其是在数据传输方面。本文将探讨大数据量串行处理的常见问题,并介绍企业常用的处理方式,最后重点阐述镭速如何提供创新解决方案&#xff0…

【20240309】WORD宏设置批量修改全部表格格式

WORD宏设置批量修改全部表格格式 引言1. 设置表格文字样式2. 设置表格边框样式3. 设置所有表格边框样式为075pt4. 删除行参考 引言 这两周已经彻底变为office工程师了,更准确一点应该是Word工程师,一篇文档动不动就成百上千页,表格图片也是上…

Linux中三次握手,四次挥手状态图,端口复用 半关闭状态,心跳包

tcp三次握手和四次挥手状态图: 为什么需要2MSL: 原因1:让四次挥手过程更加可靠,确保最后一个发送给对方的ACK到达;若对方没有收到ACK应答,对方会再次发送FIN请求关闭,此时在2MSL时间内被动关闭…

MySQL-锁:共享锁(读)、排他锁(写)、表锁、行锁、意向锁、间隙锁,锁升级

MySQL-锁:共享锁(读)、排他锁(写)、表锁、行锁、意向锁、间隙锁 共享锁(读锁)、排他锁表锁行锁意向锁间隙锁锁升级 MySQL数据库中的锁是控制并发访问的重要机制,它们确保数据的一致性…

[C语言][PTA基础C基础题目集] strtok 函数的理解与应用

一.strtok函数的解释与说明 ①strtok函数的功能 Find the next token in a string. 即查找字符串中的下一个标记. 就是将一个字符串分割成一系列的子串. ②strtok函数的原型 char *strtok( char * strToken, const char * strDelimit ); strToken: 要分割的字符串. strDel…

【机器学习】在Python中进行K-Means聚类和层次聚类

文章目录 Python中聚类算法API的使用指南K-Means 聚类步骤一:导入必要的库步骤二:加载数据步骤三:应用K-Means聚类步骤四:保存聚类结果 层次聚类步骤一:导入库步骤二:加载数据并计算距离矩阵步骤三&#xf…

MyBatis拦截器四种类型和自定义拦截器的使用流程

文章目录 MyBatis拦截器四种类型和自定义拦截器的使用流程一、MyBatis拦截器四种类型的详细解释:1. **ParameterHandler 拦截器**:2. **ResultSetHandler 拦截器**:3. **StatementHandler 拦截器**:4. **Interceptor Chain 拦截器…

Threejs粒子水波纹效果

依赖 three(这个重要)react (这个不重要)ahooks(这个不重要)unocss(这个不重要) 效果 代码 import React, { useEffect, useRef } from react; import { useGetState } from ahoo…

数据结构---C语言栈队列

知识点: 栈: 只允许在一端进行插入或删除操作的线性表,先进后出LIFO 类似一摞书,按顺序拿,先放的书只能最后拿; 顺序栈:栈的顺序存储 typedef struct{Elemtype data[50];int top; }SqStack; SqS…