【重温设计模式】原型模式及其Java示例

【重温设计模式】原型模式及其Java示例

原型模式的介绍

在编程的世界里,有一种神秘而强大的法宝,它就是设计模式。设计模式,就像是一种编程的哲学,是对软件工程中的一些经典问题的通用解决方案。它能够帮助我们更好地组织代码,提高代码的可读性和可维护性,增强代码的稳定性和灵活性。而在这其中,有一种特殊的设计模式,它就是原型模式。

原型模式,顾名思义,就是通过复制一个已存在的实例来返回新的实例,而不是每次都通过新建实例的方式。这种模式的特点是简单、高效,尤其适用于创建复杂或者构造耗时的实例。例如,我们在编写一个游戏的时候,需要创建大量的怪物实例,如果每次都通过新建实例的方式,可能会消耗大量的时间和资源。而如果我们有一个怪物的原型,就可以通过复制这个原型来快速创建新的怪物实例,从而大大提高效率。

现在,我们已经了解了原型模式的基本概念和特性,接下来,我们将更深入地探讨原型模式的结构,包括抽象原型类和具体原型类的设计和实现。

原型模式的结构

在设计模式中,原型模式是一种相对简单但却极其强大的模式。它的基础结构主要由两部分组成:抽象原型类和具体原型类。

首先,我们来看看抽象原型类。它是一个接口,定义了一个名为clone的方法。这个方法的职责就是创建并返回一个和自己类型相同的新对象。在Java中,我们通常通过实现Cloneable接口来达到这个目的。下面是一个简单的例子:

public abstract class AbstractPrototype implements Cloneable {
    public Object clone() {
        Object clone = null;
        try {
            clone = super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return clone;
    }
}

然后是具体原型类。它是实现了抽象原型类的具体类,除了继承抽象原型类中的clone方法,还可以添加其他自定义的方法。比如,我们可以定义一个名为OneMore的类,它继承了AbstractPrototype类,并添加了一个自定义的方法:

public class OneMore extends AbstractPrototype {
    public void customMethod() {
        // 自定义的方法
    }
}

通过clone方法,我们可以轻松地创建出新的对象,而无需通过new关键字。这样就大大提高了程序的效率。同时,由于clone方法是在运行时动态地复制对象,因此也提高了程序的灵活性。

然而,任何事物都有两面性,原型模式也不例外。接下来,我们将深入探讨原型模式的优点和缺点,以及在什么情况下应该使用原型模式。

原型模式的优缺点

原型模式,这个名字听起来有些让人迷惑,但实际上它的本质非常简单——它就是通过复制一个已存在的实例来返回新的实例,而不是通过新建一个。这听起来可能有些抽象,但如果你想象一下生活中的场景,比如复印机,就能理解这个模式的精髓了。复印机并不是通过重新书写一份文件来复制它,而是通过扫描原文件,然后打印出一模一样的复制品。这就是原型模式的精髓。

原型模式的优点很明显,首先,它可以极大地提高程序的运行效率。因为原型模式是在内存中直接进行复制,避免了通过new关键字来创建对象的耗时操作。其次,它可以逃避构造函数的约束,因为对象的复制是在运行时进行的,所以即使对象的构造函数是私有的,也可以通过原型模式来创建新的对象。

然而,原型模式并非完美无缺,它也有一些缺点。首先,由于原型模式是在内存中进行复制,所以它并不适合复制一些包含大量外部资源或耗费大量内存的对象。其次,由于原型模式是通过复制来创建新的对象,所以如果原型对象中包含一些引用类型的成员变量,那么这些成员变量的值将会被共享,这可能会引发一些意想不到的问题。

至于在什么情况下应该使用原型模式,一般来说,如果一个系统需要在运行时动态地创建一些与当前对象类似的新对象,而且这些对象的创建过程比较耗时,那么可以考虑使用原型模式。另外,如果一个系统的对象构造函数不易获取,或者系统需要逃避构造函数的某些约束,也可以考虑使用原型模式。

让我们通过一个具体的Java编程例子,来详细地演示如何在Java中实现原型模式,包括代码编写和运行结果。

Java中的原型模式实例

在Java编程语言中,原型模式是一种创建型设计模式,它使用已有对象的副本来创建新的对象。这种模式通常适用于创建对象的成本较高的情况,例如,当对象的创建涉及到复杂的数据库操作或者网络请求时。

我们来看一个具体的例子,假设我们有一个名为OneMore的类,这个类的创建过程非常复杂,包括从数据库中获取数据,进行数据处理等一系列操作。为了避免每次创建OneMore对象时都需要进行这些复杂的操作,我们可以使用原型模式来优化。

首先,我们需要让OneMore类实现Cloneable接口,并重写clone方法:

public class OneMore implements Cloneable {
    // ... 其他代码

    @Override
    public OneMore clone() {
        try {
            return (OneMore) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }
}

然后,我们可以通过复制已有的OneMore对象来创建新的对象,而不需要再次进行复杂的创建过程:

OneMore oneMore1 = new OneMore();
// ... 设置oneMore1的状态

// 使用原型模式创建新的对象
OneMore oneMore2 = oneMore1.clone();

运行上述代码,我们会发现oneMore2是一个与oneMore1状态相同的新对象,但它们是两个不同的实例。这就是原型模式的魅力所在,它能帮助我们在保证性能的同时,简化对象的创建过程。

然而,原型模式并不是万能的,它也有自己的适用场景。下面我们就来讨论一下原型模式在实际开发中的应用,以及如何根据实际需求选择使用原型模式。

原型模式的应用场景

原型模式可以提高创建对象的效率,是一种非常高效的创建对象的方法。

实例讲解

在我们日常的开发中,原型模式的应用场景非常广泛。例如,我们正在开发一个在线购物系统,用户可以在购物车中添加商品。每次添加商品时,我们都需要创建一个新的商品对象。如果每次都通过new关键字去创建新的对象,那么当商品数量非常多时,将会消耗大量的系统资源。

这时,我们可以使用原型模式来优化这个问题。我们先创建一个商品原型对象,然后每次需要添加商品时,都通过复制这个原型对象来创建新的商品对象。这样,无论商品数量多少,都只需要创建一个原型对象,大大提高了系统的性能。

class Product implements Cloneable {
    private String name;
    private double price;

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public Product clone() {
        try {
            return (Product) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }

    public void OneMore() {
        System.out.println("One more product: " + this.name);
    }
}

在上述代码中,我们定义了一个商品类Product,并实现了Cloneable接口。在clone方法中,我们通过调用super.clone()方法来复制原型对象。在OneMore方法中,我们打印了商品的名称,表示我们创建了一个新的商品对象。

如何选择使用原型模式

在实际开发中,我们应该如何选择使用原型模式呢?一般来说,当满足以下条件时,我们可以考虑使用原型模式:

  1. 当一个系统需要独立于其产品创建、组合和表示时。
  2. 当需要实例化的类是在运行时刻指定时,例如,通过动态装载。
  3. 为了避免创建一个与产品类层次平行的工厂类层次时。

总的来说,原型模式是一种非常高效的创建对象的方法,它可以帮助我们在保证性能的同时,简化代码的复杂度。在实际开发中,我们应该根据实际需求,灵活选择使用原型模式。

总结

如同一部精彩的小说,我们走过了原型模式的起承转合,从基本概念的介绍,到结构的解析,再到优缺点的探讨,最后我们还通过实例讲解和应用场景的分析,深入浅出地理解了原型模式。原型模式,这个看似晦涩难懂的专业名词,其实就像是我们生活中的复印机,通过复制已有的实例来创建新的实例,简单高效。

然而,任何事物都有其两面性,原型模式也不例外。它虽然能够大大提高程序的运行效率,简化对象的创建过程,但是也存在一些缺点,比如并不适合复制一些包含大量外部资源或耗费大量内存的对象,还有可能引发一些意想不到的问题。因此,我们在使用原型模式时,需要根据实际情况进行权衡,选择最适合的设计模式。

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

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

相关文章

又现股东大额减持,东鹏饮料业绩预喜也难“救市”?

“醒着拼”的东鹏饮料(605499.SH),市值“累了困了”? 1月27日,东鹏饮料公布了2023年的业绩预告显示:预计将达到110.57亿元-113.12亿元,同比增长30%-33%;净利润预计在19.89亿元-20.61亿元之间,同…

汇编语言与接口技术实践——秒表

1. 设计要求 基于 51 开发板,利用键盘作为按键输入,将数码管作为显示输出,实现电子秒表。 功能要求: (1)计时精度达到百分之一秒; (2)能按键记录下5次时间并通过按键回看 (3)设置时间,实现倒计时,时间到,数码管闪烁 10 次,并激发蜂鸣器,可通过按键解除。 2. 设计思…

数学建模【GM(1, 1)灰色预测】

一、GM(1, 1)灰色预测简介 乍一看,这个名字好奇怪,其实是有含义的 G:Grey(灰色)M:Model(模型)(1, 1):只含有一个变量的一阶微分方程模型 提到灰色,就得先说…

基于InSAR、CNN的滑坡监测(一)

文献阅读记录,也是组会汇报材料收集,从中文文献开始学习。 开发一种快速、精确且自动化程度较高的滑坡定位或检测模型可以为地质灾害防治提供有效支撑,为研究滑坡分布规律及滑坡潜在风险等问题提供技术支持 ①《基于高分辨率遥感影像和改进 U-Net 模型的…

【Spring Cloud】高并发带来的问题及常见容错方案

文章目录 高并发带来的问题编写代码修改配置压力测试修改配置,并启动软件添加线程组配置线程并发数添加Http取样配置取样,并启动测试访问message方法观察效果 服务雪崩效应常见容错方案常见的容错思路常见的容错组件 总结 欢迎来到阿Q社区 https://bbs.c…

YOLOv5改进 | SPPF篇 | 利用YOLOv9最新的SPPELAN模块改进SPPF(全网独家创新,附手撕结构图)

一、本文介绍 本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的SPPELAN模块来改进SPPF,其中YOLOv9针对于这个模块并没有介绍,只是在其项目文件中用到了,我将其整理出来用于我们的YOLOv5的项目,同时空间金字塔池化作为我们YOLOv5中的一个比较独特的存…

算法学习(十三)多路归并

多路归并 1. 概念 一、多路归并算法的由来 假定现在有一包含大量整数的文本文件存放于磁盘中,其文件大小为10GB,而本机内存只有4GB。此时若我们要对该文件中的所有整数进行升序排序,肯定不能直接将文件中的所有数据一次性读入内存中&#x…

《Docker 简易速速上手小册》第7章 高级容器管理(2024 最新版)

文章目录 7.1 容器监控与日志7.1.1 重点基础知识7.1.2 重点案例:监控 Flask 应用7.1.3 拓展案例 1:使用 ELK Stack 收集和分析日志7.1.4 拓展案例 2:使用集成监控工具 7.2 性能调优与资源限制7.2.1 重点基础知识7.2.2 重点案例:Fl…

边缘计算网关与边缘计算的融合之道-天拓四方

随着物联网、大数据和人工智能的飞速发展,数据处理和分析的需求呈现出爆炸式增长。传统的中心化数据处理模式已难以满足实时性、低延迟和高带宽的需求,边缘计算应运而生,成为解决这一难题的关键技术。而边缘计算网关,作为连接边缘…

护眼台灯哪个品牌质量比较好?五大优质护眼台灯推荐!

护眼台灯作为近年来最受欢迎的灯具之一,它不仅可以提供充足明亮的光照,光线环境,从而减少眼睛的负担和疲劳,还能够实现预防近视的效果,所以很多家长都会给孩子准备护眼台灯。但也有不少朋友觉得护眼台灯是名副其实的智…

爆火的Sora,动了谁的奶酪?

北京时间2月16日凌晨,当我们还沉浸在春节假期的喜庆和欢乐中时,Open AI 官宣推出首个文生视频模型 Sora。一年多前,Chat GPT 的横空出世,引起了全球广泛关注。如今 Sora 的出现,再次掀起千层浪。 只需要一段文本描述&a…

校招失败后,在小公司熬了 2 年终于进了字节跳动,竭尽全力....

其实两年前校招的时候就往字节投了一次简历,结果很明显凉了,随后这个理想就被暂时放下了,但是这个种子一直埋在心里这两年除了工作以外,也会坚持写博客,也因此结识了很多优秀的小伙伴,从他们身上学到了特别…

SMTP和IMAP是什么?SMTP的定义及工作模式?

SMTP是什么邮件的协议?如何开启网站邮箱SMTP服务? 随着互联网的普及和电子邮件的广泛使用,SMTP和IMAP这两个名词逐渐进入了我们的视野。它们是什么?它们在我们的日常生活中扮演着怎样的角色呢?下面,蜂邮ED…

C语言--贪吃蛇

目录 1. 实现目标2. 需掌握的技术3. Win32 API介绍控制台程序控制台屏幕上的坐标COORDGetStdHandleGetConsoleCursorinfoCONSOLE_CURSOR_INFOSetConsoleCursorInfoSetConsoleCursorPositionGetAsyncKeyState 4. 贪吃蛇游戏设计与分析地图<locale.h>本地化类项setlocale函…

uniapp微信小程序解决上方刘海屏遮挡

问题 在有刘海屏的手机上&#xff0c;我们的文字和按钮等可能会被遮挡 应该避免这种情况 解决 const SYSTEM_INFO uni.getSystemInfoSync();export const getStatusBarHeight ()> SYSTEM_INFO.statusBarHeight || 15;export const getTitleBarHeight ()>{if(uni.get…

信号完整性分析基本概念

“设计师可以分成两类&#xff0c;一类已经遇到了信号完整性问题&#xff0c;另一类即将遇到信号完不整性问题” 随着时钟频率的提高&#xff0c;发现并解决信号完整性问题成为产品开发的关键。因此需要精通信号完整性分析技术&#xff0c;并能采取高效设计过程以消除这些问题…

如何使用群晖NAS中FTP服务开启与使用固定地址远程上传下载本地文件?

文章目录 1. 群晖安装Cpolar2. 创建FTP公网地址3. 开启群晖FTP服务4. 群晖FTP远程连接5. 固定FTP公网地址6. 固定FTP地址连接 本文主要介绍如何在群晖NAS中开启FTP服务并结合cpolar内网穿透工具&#xff0c;实现使用固定公网地址远程访问群晖FTP服务实现文件上传下载。 Cpolar内…

实践案例分析:让数据说话,高效盘点研发效能,助力企业2024发展 | 活动回顾

前不久&#xff0c;思码逸 DevData Talks 落地深圳南山区&#xff0c;举办了一场以「中小到千人规模团队研发效能提升实践 」为主题的闭门沙龙&#xff0c;共探研发增效之道。活动邀请到了几位来自不同研发规模的团队的研发效能负责人齐聚一堂&#xff0c;分别是平安银行组织级…

SD-WAN:三步轻松实现异地访问总部内网

随着经济的蓬勃发展和企业业务范围的不断扩张&#xff0c;许多企业逐渐形成了以总部为核心的多点生产结构&#xff0c;并通过网络实现了总部与分支机构之间的信息互通。要实现对企业总部内网的异地访问并非易事&#xff0c;但如果应用了SD-WAN这些问题将被轻松解决。 某企业在总…

React18源码: Fiber树的初次创建过程图文详解

fiber树构造&#xff08;初次创建&#xff09; fiber树构造的2种情况&#xff1a; 1.初次创建 在React应用首次启动时&#xff0c;界面还没有渲染此时并不会进入对比过程&#xff0c;相当于直接构造一棵全新的树 2.对比更新 React应用启动后&#xff0c;界面已经渲染如果再次发…