热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

原型模式PrototypePattern

一、模式介绍1.1、定义用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类

一、模式介绍


1.1、定义

用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种模式创建对象非常高效,根本无须知道对象创建的细节。


1.2、优点


  1. Java 自带的原型模式基于内存二进制流的复制,在性能上比直接 new 一个对象更加优良
  2. 可以使用深克隆模式保存对象的状态,使用原型模式将对象复制一份,并将其状态保存起来,简化了创建对象的过程,以便在需要的时候使用,可辅助实现撤销操作

1.3、缺点


  1. 需要为每一个类都配置一个 clone 方法
  2. clone 方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违背了开闭原则
  3. 当实现深克隆时,需要编写较为复杂的代码,而且当对象之间存在多重嵌套应用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。因此,深克隆、浅克隆需要运用得当。

原型模式的克隆分为浅克隆和深克隆。

  1. 浅克隆:创建一个新对象,新对象的属性和原来对象完全相同;对于引用类型属性的地址,仍指向原有属性所指向的对象的内存地址。
  2. 深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址


二、结构与实现


2.1、结构


  1. 抽象原型类(Prototype):规定了具体原型对象必须实现的接口
  2. 具体原型类(Realizetype):实现抽象原型类的 clone 方法,它是可被复制的对象
  3. 访问类(PrototypeTest):使用具体原型类的 clone 方法来复制新的对象
    在这里插入图片描述

2.2、实现

Java 中的 Object 类提供了浅克隆的 clone() 方法,具体原型类只要实现 Cloneable 接口就可实现对象的浅克隆,这里的 Cloneable 接口就是抽象原型类。

在这里插入图片描述


2.3、Prototype

package com.erlang.prototype;/*** @description: 具体原型类* 浅克隆* @author: erlang* @since: 2022-02-10 20:53*/
public class Prototype implements Cloneable {public Prototype() {System.out.println("具体原型创建成功!");}@Overrideprotected Object clone() throws CloneNotSupportedException {System.out.println("具体原型复制成功!");return super.clone();}
}

2.4、PrototypeTest

package com.erlang.prototype;/*** @description: 原型模式的测试类* @author: erlang* @since: 2022-02-10 20:54*/
public class PrototypeTest {public static void main(String[] args) throws CloneNotSupportedException {Prototype obj1 = new Prototype();Prototype obj2 = (Prototype) obj1.clone();System.out.println("obj1 == obj2 : " + (obj1 == obj2));}}

推荐阅读
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • 本文详细介绍了如何使用C#实现不同类型的系统服务账户(如Windows服务、计划任务和IIS应用池)的密码重置方法。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • ASP.NET 进度条实现详解
    本文介绍了如何在ASP.NET中使用HTML和JavaScript创建一个动态更新的进度条,并通过Default.aspx页面进行展示。 ... [详细]
  • td{border:1pxsolid#808080;}参考:和FMX相关的类(表)TFmxObjectIFreeNotification ... [详细]
  • 默认情况下,Java 的克隆机制是浅克隆,即仅复制对象本身而不复制其内部引用的对象。本文将详细介绍如何通过深度克隆来确保对象及其内部引用的对象都能被正确复制。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
  • 本文探讨了如何使用Scrapy框架构建高效的数据采集系统,以及如何通过异步处理技术提升数据存储的效率。同时,文章还介绍了针对不同网站采用的不同采集策略。 ... [详细]
  • 本文详细介绍了 com.apollographql.apollo.api.internal.Optional 类中的 orNull() 方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • GDI+ 进阶指南:深入解析 IGPFont 接口
    本文深入探讨了 GDI+ 中 IGPFont 接口的应用与实现,通过具体的代码示例展示了如何在 Delphi 中使用 GDI+ 进行高质量的文本渲染。文章详细解析了 IGPFont 接口的各项属性和方法,并提供了实用的编程技巧,帮助开发者更好地理解和掌握 GDI+ 的字体处理功能。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • 数组容量的动态调整与优化策略
    在探讨数组容量动态调整与优化策略时,本文分析了两种常见的方法。首先,通过使用for循环逐个复制元素实现扩容,但这种方法存在计算索引的复杂性问题。其次,利用System.arraycopy()方法进行高效复制,显著提升了性能和代码可读性。此外,文章还讨论了动态数组在不同应用场景下的优化策略,包括预分配容量和按需扩展等技术,以提高程序的整体效率。 ... [详细]
author-avatar
昆明DVD导航
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有