设计模式系列之原型模式(Prototype)

【愚公系列】二十三种设计模式(四)-原型模式(Prototype Pattern) 设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。 阅读详情
概述:

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式之一。
这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

特点:

原型模式是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。主要解决在运行期建立和删除原型。
优点:

  1. 性能提高。
  2. 逃避构造函数的约束。

缺点:

  1. 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
  2. 必须实现 Cloneable 接口。
使用场景:
  1. 资源优化场景。
  2. 类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。
  3. 性能和安全要求的场景。
  4. 通过 new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
  5. 一个对象多个修改者的场景。
  6. 一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。
  7. 在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。
实现方法:

原型模式的实现方式十分简单
原型接口必须有一个可以克隆自己的方法,反回类型为Prototype

public interface Prototype {
    public Object clone();
}

然后是需要一个原型类供其他人克隆引用,所以要实现 Prototype接口,具备克隆的能力

/**
 * @Author mzh
 * @Date 2023/3/25
 */
public class Plane implements Prototype{
    /**
     * 飞机名字
     */
    private String name;

    /**
     * 飞机重量
     */
    private String height;

    public Plane(){
        this.name = "Name:" + Math.random();
        this.height = "height:" + Math.random();
    }

    public Plane(Plane plane){
        this.name = plane.getName();
        this.height = plane.getHeight();
    }

    public String getName() {
        return name;
    }

    public String getHeight() {
        return height;
    }

    @Override
    public Object clone() {
        return new Plane(this);
    }
}

然后就是客户端的引用

/**
 * @Author mzh
 * @Date 2023/3/25
 */
public class PrototypeDemoTest {
    public static void main(String[] args) {
        Plane plane = new Plane();
        System.out.println(plane.getName());
        System.out.println(plane.getHeight());
        Plane clone = (Plane) plane.clone();
        System.out.println(clone.getName());
        System.out.println(clone.getHeight());
    }
}

运行客户端的代码,可以得到运行结果

Name:0.9873778434480015
height:0.8991139462401434
Name:0.9873778434480015
height:0.8991139462401434

由运行结果可以发现,克隆类实际和被克隆的对象内容是相同的。

深拷贝与浅拷贝

与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流。

  • 浅拷贝:当拷贝对象只包含简单的数据类型比如int、float 或者不可变的对象(字符串)时,就直接将这些字段复制到新的对象中。而引用的对象并没有复制而是将引用对象的地址复制一份给克隆对象
  • 深拷贝:不管拷贝对象里面简单数据类型还是引用对象类型都是会完全的复制一份到新的对象中

欢迎关注我的公众号

Arduino程序设计(十四)舵机控制实验(SG90) 本文介绍SG90舵机控制原理及实验,主要内容有:1、介绍SG90舵机;2、舵机0°~180°来回转动;3、串口控制舵机转动固定角度。(1)舵机是一种位置(角度)伺服的驱动器。舵机只是一种通俗的叫法,其实质是一个伺服马达。在需要角度不断变化并可以保持的控制系统中应用广泛。如遥控机械人、飞机模型等。(2)舵机的转动角度为0~180°,其内部结构包括电机,控制电路和机械结构三部分。电机有三根线引出,分别接VCC、GNG和信号线。 阅读详情

相关推荐

阿里云导出的镜像raw转换成vmdk格式工具

阿里云导出的镜像raw转换成vmdk格式工具 1.安装java环境,安装教程不介绍了 2.raw2vmdk软件下载: 在我的链接里面: 3.使用 打开cmd.bat软件: java -jar raw2vmdk.jar (原镜像)C:\\images\\raw\\disk.img (转换的镜像)D:\\images\\vmdk\\disk.vmdk 4.vmware打开vmdk文件 ...

3843

【图解设计模式系列】The Prototype Pattern: 原型模式

定义: 原型模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例。使用原型模式创建的实例,具有与原型一样的数据。 原型模式的三个特点: 1.由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。 2.目标对象是原型对象的一个克隆。也就是说,通过Prototype模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值。 3.根据对象克隆深度层次的不同,有浅克隆与深克隆。 原型模式的三个应用场景 在创建对象的时候,我们不只是希望被创建的对象继承其基类的基本结

Tech in Pieces 455

shader基于高度的权重混合

效果图: 基于高度的权重混合 , 效果描述: (1)混合:三层混合, 例如 第一层是草,第二层是石头,第三层是沙子,三者混合显示 (2)权重: 三层的权重的和 为1, 三者是此消彼长的关系 (3)高度:高度会限制或者说是 束缚 着 效果 关于混合,再多说几句: (1)基于权重的混合:权重 ,跟顺序没有关系 只跟权重的大小有关系(在一层一层界限不清晰的地方,特别适用!!效果极好!!!!) (2)基于叠加的混合: 叠加 就是 一层一层的往上加。。。。 所以顺序特别重要(在雪地等效果中使用:因为

木马人 1117

设计模式系列之05-原型模式(Prototype Pattern)

概述 在软件系统中,有时候面临的产品类是动态变化的,而且这个产品类具有一定的等级结构。这时如果用工厂模式,则与产品类等级结构平行的工厂方法类也要随着这种变化而变化,显然不大合适。那么如何封装这种动态的变化?从而使依赖于这些易变对象的客户程序不随着产品类变化? 意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 结构图 Prototype模式结构图 生活中的例子

挨踢生涯 756

前端开发学习--登录和注册页面设计(html和css,可完成两个页面点击切换)

今天学习了登录和注册页面的设计,主要是HTML和CSS部分,注册和切换采用了Js代码进行,后面将通过js进行填写内容的验证,进而可通过JSP跳转到Servlet进行DAO数据的校验,这属于后端部分了。 总体设计思路:整个页面设计可以分为主体(content)、头部(content-header)、内容(content-body)三个部分组成,其中是主体是根部,包含了头部和内容,头部和内容各自下设两...

weixin_43691879的博客 1万+

Ferry工单平台部署

ferry工单平台部署

运维求生之路 1897

极速理解设计模式系列:4.原型模式(Prototype Pattern)

四个角色:抽象原型角色(Prototype)、具体原型角色(ConcretePrototype)、原型管理器角色(PrototypeManager)、客户端角色(Client) 抽象原型角色(Prototype):定义原型的克隆方法接口 具体原型角色(ConcretePrototype):实现原型具体的克隆方法 ...

weixin_34185364的博客 123

Yolov5 多边形标签转换,所有json文件自动转成txt格式[详细过程]

注:labelme是麻省理工(MIT)的计算机科学和人工智能实验室(CSAIL)研发的图像标注工具,人们可以使用该工具创建定制化标注任务或执行图像标注,项目源代码已经开源。通过labelme对图进行标注后,得到的是json文件,而Yolov5对数据进行模型构建的时候,读取需要的是txt格式的文件。txt_outer_path——保存txt文本的文件夹的绝对路径。json_name——json_name是json文本的名字。json_floder——读取json的文件夹的绝对路径。

Pandas_007的博客 1万+

设计模式系列-原型模式-Prototype

原型模式介绍 原型模式属于创建对象类型模式,获取一个类的对象时不是每次从头创建一个新对象,而是从先创建类的一个对象作为原型,每次获取对象时从已创建好的对象复制一份。在Java 中,实现原型模式,一般通过对象克隆技术实现。 为什么创建对象时是对象复制而不是通过构造方法创建一个对象呢?哪个方式更简单?大部分情况下不需要复制对象,但是在企业应用开发中对性能要求比较苛刻,比如创建一个对象需要调用非常耗时的操作,比如网络请求、读数据库或者读取磁盘文件,创建耗时的逻辑被大量请求,为了提升性能避免重复创建,这时可以用原型

独 coding 乐不如众 coding 乐 236

PCL Fast Global Registration 快速全局配准(源码版)

Fast Global Registration(FGR)是一种经典的点云粗配准算法,已集成到Open3D和CloudCompare等软件中。本文介绍了该算法的源码实现及优化方法,包括如何通过修改源码直接读取点云进行配准,而不依赖文件中读取特征描述子。文章还提供了关键参数设置(如最大迭代次数、匹配距离等)。算法实现简单高效,未来计划发布基于纯PCL的版本。源码和论文链接已附上,供开发者参考。

点云侠的博客 383

基于 ESP32+IMU+BLE HID 的低延迟无线体感游戏控制器设计与实现

本文设计的基于 ESP32 的低延迟无线体感游戏控制器,通过合理的硬件选型与软件优化,实现了体感姿态感知与无线低延迟传输的核心功能。硬件上采用 ESP32+MPU6050+TP4056 的低成本方案,接线简单、便携性强;软件上通过轻量化库、互补滤波算法与非阻塞 BLE 传输,有效降低了系统延迟,满足体感游戏的使用需求。

weixin_42300449的博客 399

PHP 设计模式系列之原型模式(Prototype)

通过创建原型使用克隆方法实现对象创建而不是使用标准的 new 方式 BarBookPrototype.php FooBookPrototype.php 4、测试代码 Tests/PrototypeTest.php 5、总结 原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是用对象内部提供的克隆方法,通过该方法返回一个对象的副本,这种创建对象的方式,相比我们之前说的几类创建型模式还是有区别的,之前的讲述的工厂方法模式与抽象工厂都是通过工厂封...

vd15528175269的博客 309

【图像超分】论文精读:SRConvNet: A Transformer-Style ConvNet for Lightweight Image Super-Resolution

本文提出了一种轻量级图像超分辨率重建方法SRConvNet,结合了卷积神经网络和Transformer的优势。针对传统Transformer计算复杂度高的问题,设计了傅立叶调制注意力(FMA)替代自注意力机制,通过区域频率空间调制实现高效的全局依赖建模;同时引入动态混合层(DML),采用混合尺度动态卷积结合通道拆分机制增强局部特征提取。实验表明,SRConvNet在计算效率和参数数量上显著优于现有轻量级超分方法,同时保持了优异的重建性能。该方法为移动端部署提供了有效的解决方案,在精度与复杂度间取得了良好平衡

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 806

【设计模式系列学习笔记】9、原型模式 prototype

原型模式prototype,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象; 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节; 对于java而言,就是克隆,需要实现Cloneable接口,并覆写clone方法,分为浅克隆和深克隆; clone默认方法,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型的,则复制引用但不复制引用的...

hellboy0621的博客 202

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

设计模式系列:原型模式(Prototype)应用实践

英[ˈprəʊtətaɪp] 原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。这就是原型模式的用意。 应用场景 原型模式就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节 原型模式的结构 原型模式要求对象实现一个可以“克隆”自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例。这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆...

NIO4444 800

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

设计模式系列:原型模式 Prototype

意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 场景 游戏场景中的有很多相似的敌人,它们的技能都一样,但是随着敌人出现的位置不同,这些人的能力不太一样。假设,我们现在需要把三个步兵组成一队,其中还有一个精英步兵,能力特别高。那么,你或许可以创建一个敌人抽象类,然后对于不同能力的步兵创建不同的子类。然后,使用工厂方法等设计模式...

weixin_30896763的博客 72

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

菜鸟学设计模式系列笔记之Prototype模式(原型模式)

菜鸟学设计模式系列笔记之Prototype模式: Intent: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 Motivation:以一个已有的对象作为原型,通过它来创建新的对象。 在增加新的对象的时候,新对象的细节创建工作由自己来负责,从而使新对象的创建过程与框架隔离开来。 应用场景: (1)当一个系统应该独立于它的产品创建、构成和表示时 (2)当要实例化的类是在

晓月清松 1210

C#设计模式系列:原型模式(Prototype)

1、原型模式简介 1.1>、定义   原型模式(Prototype)用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。 1.2>、使用频率    中 1.3>、原型模式应用   首先从实际生活来了解原型模式的由来,假设你有一份非常好的讲义,你的朋友也想要一份,那么怎么办?重新手抄一份?显然不是,当然是用复印机复印一份来得方便、直接,并且准确性也高,这种用...

weixin_34365635的博客 144

设计模式学习系列6 原型模式(prototype)

原型模式(prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。允许一个对象再创建另外一个新对象的时候根本无需知道任何创建细节,只需要请求圆形对象的copy函数皆可。 1原型模式构成 客户(Client)角色:客户类提出创建对象的请求。抽象原型(Prototype)角色:这是一个抽象角色,C++实现的抽象类,此角色给出所有的具体原型类所需的接口。具体原型(Co...

weixin_34248849的博客 94

TPS259483AYWPR与dsPIC30F4013的电源路径保护设计解析

嵌入式系统中,电源路径保护是保障设备可靠运行的关键环节。传统保险丝加TVS的方案在响应速度、精度和诊断能力上逐渐暴露局限,而集成式电子保险丝(eFuse)凭借微秒级响应、可编程阈值和故障上报能力,正成为工业与车载电源管理的优选。本文基于TPS259483AYWPR与dsPIC30F4013的协作架构,深入探讨eFuse在过流、过压、浪涌和热关断场景下的保护机制,并结合MCU实现状态监控、时序控制与故障记录。从概念原理到PCB布局、固件状态机设计,再到实测数据与现场案例,全面展示了嵌入式工程师如何从零搭建一套

weixin_33906657的博客 360

设计模式总结篇系列:原型模式(Prototype)

首先对原型模式进行一个简单概念说明:通过一个已经存在的对象,复制出更多的具有与此对象具有相同类型的新的对象。 在理解Java原型模式之前,首先需要理解Java中的一个概念:复制/克隆。 在博文《Java总结篇系列:java.lang.Object》一文中,对Java中的clone()方法进行了一定的阐述。同时,我们需要知道,Java中的对象复制/克隆分为浅复制和深复制。 一、浅复制: 我们...

weixin_34357436的博客 151

设计模式系列学习四:原型模式(Prototype)

我简单看了看,不知道这个模式存在的意义。至少现在真是这种感觉。 http://blog.youkuaiyun.com/iihero/article/details/7519456   原型模式(ProtoType) 通过一个原型对象来创建一个新对象(克隆)。Java中要给出Clonable接口的实现,具体类要实现这个接口,并给出clone()方法的实现细节,这就是简单原型模式的应用。  浅拷贝:只

学习记录 1026
上一篇: 设计模式系列之建造者模式(Builder)
下一篇: 设计模式系列之装饰器模式(Decorator)
工程师小哥
博客等级 码龄10年 4粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值