《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;
    }
    @Override
    public String getName() {
   
        return name;
    }

    @Override
    public 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;
    }
    @Override
    public String getName

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

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

相关文章

Leetcode 543. 二叉树的直径

题目描述: 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例 1: 输入:ro…

aardio 调用 C#程序读 Freeplane.mm文件,生成测试用例.csv文件

C# 请参阅:C# 用 System.Xml 读 Freeplane.mm文件,生成测试用例.csv文件 Freeplane 是一款基于 Java 的开源软件,继承 Freemind 的思维导图工具软件,它扩展了知识管理功能,在 Freemind 上增加了一些额外的功能&#x…

从龙珠到Cocos游戏开发中的无限循环滚动背景

引言 从龙珠到Cocos游戏开发中的无限循环滚动背景 近日,鸟山明去世的消息传来,网友们纷纷表示哀悼,这位被外交部哀悼的鸟山明或许你不熟悉,但是他的作品《龙珠》承载着一代人的记忆与青春。 **《龙珠》**作为一部向中国文化致敬的作品,笔者在刷视频时回忆了许多,当看到…

Xcode remove the package dependency

Xcode Version 15.2 (15C500b) 🤔️ 想知道直接右键,这个 Delete 为什么是禁用状态 推荐一下刚上线的 App 熊猫小账本,里面有用到这篇博客讲的内容 熊猫小账本 一个简洁的记账 App,用于记录日常消费开支收入,使用 iCl…

模块化机房:数据中心的未来

随着数字化转型加速,数据中心已成为企业运营的核心。传统的数据中心面临空间利用不足、能源效率低下、扩展性差和维护成本高等问题。模块化机房应运而生,它不仅克服了传统设计的局限,还为数据中心的建设和运营带来了革命性的改变。本文将探讨…

16. UE5 RPG获取GE应用的回调,并根据Tag设置数据显示到窗口

在上一篇介绍了对标签如何在项目中设置,这一篇先讲解一下如何在GE里面使用GameplayTag标签。 之前我在第十一章节中 11. UE5 RPG使用GameplayEffect修改角色属性(二)介绍了一些GE的属性,在UE 5.3版本中,修改的配置方式…

使用零一万物 200K 模型和 Dify 快速搭建模型应用

本篇文章,我们聊聊如何使用 LLM IDE (Dify) 快速搭建一个模型应用,以及使用超长上下文的 200K 模型,完成懒人式的电子书翻译。 准备工具 最近在 GitHub 上看到了前 HuggingFace 员工,前 transformers 核心贡献者之一的 Stas Bek…

通过一篇文章让你了解什么是函数栈帧

函数栈帧的创建和销毁 前言一、什么是函数栈帧二、 理解函数栈帧能解决什么问题三、 函数栈帧的创建和销毁解析3.1 什么是栈3.2 认识相关寄存器和汇编指令相关寄存器eaxebxebpespeip 相关汇编命令 3.3 解析函数栈帧的创建和销毁3.3.1 预备知识3.3.2 函数的调用堆栈3.3.4 准备环…

参考线平滑 - FemPosDeviation算法

FemPosDeviation参考线平滑方法是离散点平滑方法 参考文章: (1)参考线平滑-FemPosDeviation-OSQP (2)Planning基础库——散点曲线平滑 (3)参考线平滑-FemPosDeviation-SQP (4&#x…

微信小程序开发系列(二十六)·小程序运行机制(启动、前后台状态、挂起、销毁)和小程序更新机制

目录 1. 小程序运行机制 1.1 启动 1.2 前台和后台状态 1.3 挂起 1.4 销毁 2. 小程序更新机制 1. 小程序运行机制 1.1 启动 小程序启动可以分为两种情况,一种是冷启动,一种是热启动。 冷启动:如果用户首次打开,或小…

基于Gui Guider进行LVGL的页面绘制和移植

在之前的文章里讲过一种页面切换的方式,那就是:定义和创建页面对象绘制页面内容切换页面。参考这篇文章: LVGL如何创建页面并实现页面的切换-CSDN博客 这篇文章讲了如何绘制并切换页面。 但是现在遇到一个问题,那就是页面绘制&…

力扣爆刷第93天之hot100五连刷51-55

力扣爆刷第93天之hot100五连刷51-55 文章目录 力扣爆刷第93天之hot100五连刷51-55一、200. 岛屿数量二、994. 腐烂的橘子三、207. 课程表四、208. 实现 Trie (前缀树)五、46. 全排列 一、200. 岛屿数量 题目链接:https://leetcode.cn/problems/number-of-islands/d…

php7.3.4连接sqlserver(windows平台)

前言 有个项目需要手上laravel连接客户的sqlserver数据库读取数据,故在本地开发的lnmp环境中,php需要增加扩展 过程 从微软官网下载sqlsrv扩展,注意注意php版本,下载地址 解压的文件会有nts和ts两个版本,本地打开phpinfo查看 将…

Claude3 正式发布,支持多模态(附注册使用教程)

免费使用教程请看到最后!!!!! AnthropicAI 官推发布消息,正式推出Claude 3,沉寂了很久的Anthropic 终于亮剑放了大招。Claude 3 系列模型,包括Claude 3 Opus、Claude 3 Sonnet 和 C…

耐腐蚀PFA气体洗涤瓶可多级串联透明特氟龙塑料氢气吸收装置

洗气瓶是一种常用于净化和干燥各种气体的实验室器皿,以去除其中的水分、油脂、颗粒物等杂质,从而使需要用到的气体满足实验要求。 PFA洗气瓶的工作原理: 主要是通过液体吸收、溶解或发生化学反应来去除气体中的杂质。在洗气过程中&#xff…

优思学院|为什么企业要做质量管理体系认证?

在二战后的美国,公司对自己的产品质量颇为自满。市场需求旺盛,产品销售状况良好,即便产品存在质量缺陷,消费者似乎也能接受。这种态度导致了一种现象:即使在生产结束时发现了一定比例的缺陷,公司也能通过加…

Day39-2-Rsync企业级备份工具讲解

Day39-2-Rsync企业级备份工具讲解 1. 什么是rsync?2. 什么是全量和增量?3. 为什么要用rsync?4. rsync功能特性5. 增量复制原理6. rsync三种工作模式介绍6.1 本地(local)6.2 远程Shell模式6.2.1 远程Shell模式企业场景和实践&…

vue.js 页面中设置多个swiper

效果&#xff1a; 设置主要设置了 动态的 包含类、 左右按钮的类 <template><div class"swiper-container_other"><!-- 右侧按钮 --><div :class"[(id)?swiper-button-nextid:swiper-button-next, swiper-button-next]"></div…

每日一题 第一期 洛谷 铺地毯

[NOIP2011 提高组] 铺地毯 https://www.luogu.com.cn/problem/P1003 题目描述 为了准备一个独特的颁奖典礼&#xff0c;组织者在会场的一片矩形区域&#xff08;可看做是平面直角坐标系的第一象限&#xff09;铺上一些矩形地毯。一共有 n n n 张地毯&#xff0c;编号从 1 …

探秘C语言扫雷游戏实现技巧

本篇博客会讲解&#xff0c;如何使用C语言实现扫雷小游戏。 0.思路及准备工作 使用2个二维数组mine和show&#xff0c;分别来存储雷的位置信息和排查出来的雷的信息&#xff0c;前者隐藏&#xff0c;后者展示给玩家。假设盘面大小是99&#xff0c;这2个二维数组都要开大一圈…