二十三种模式之原型模式(类比制作陶器更好理解一些)

1. 设计模式的分类

创建型模式(五种):工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。
结构型模式(七种):适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。
行为型模式(十一种):状态模式、模板方法模式、访问者模式、迭代子模式、责任链模式、备忘录模式、解释器模式、命令模式、中介者模式、观察者模式、策略模式。

2. 什么是原型模式?

原型模式是一种创建型设计模式,它允许一个对象在创建另一个可定制的对象,而无需知道如何创建的细节。这种模式通过复制现有的对象来创建新的实例,而不是新建一个。原型模式的主要优点是它可以避免直接创建对象的开销,特别是当对象创建过程复杂或耗时时。

(将原型模式融入生活,更好理解)想象一下,你正在制作陶器。你有一个原始的陶器模型,你可以通过复制这个模型来创建许多相似的陶器。这个过程不需要从头开始制作每一个陶器,而是通过复制一个已经存在的模型来快速创建新的陶器。这就是原型模式的核心思想:通过复制已有对象来创建新对象,而不是每次都从头开始创建。

3. 原型模式的组成

原型模式通常包含以下角色:

  • 原型(Prototype):这是一个抽象类或接口,声明了克隆自身的接口。
  • 具体原型(Concrete Prototype):实现克隆接口以创建自己的副本。
  • 客户端(Client):使用克隆方法创建对象的实例。

4. 原型模式的实现

4.1 定义一个原型接口

首先,定义一个原型接口,它声明了一个 clone() 方法。

public interface Prototype extends Cloneable{Prototype clone();
}

4.2 创建具体原型类

然后,创建一个具体的原型类,实现 Prototype 接口,并重写 clone() 方法。

public class ConcretePrototype implements Prototype{private String id;private String value;public ConcretePrototype(String id, String value) {this.id = id;this.value = value;}@Overridepublic Prototype clone() {try {return (ConcretePrototype)super.clone();} catch (CloneNotSupportedException e) {throw new RuntimeException(e);}}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}@Overridepublic String toString() {return "ConcretePrototype{" +"id='" + id + '\'' +", value='" + value + '\'' +'}';}
}

4.3 客户端代码

最后,编写客户端代码,使用原型模式创建对象的副本。

public class Main {public static void main(String[] args) {//创建一个原型实例ConcretePrototype prototype = new ConcretePrototype("1","阿伟");//克隆原型,创建一个新对象Prototype clonePrototype = prototype.clone();System.out.println("Original:" + prototype);System.out.println("Clone:" + clonePrototype);}
}

以下为运行结果:

5. 原型模式的适用场景

原型模式适用于以下场景:

  1. 创建对象成本较大时:如果创建对象的实例非常消耗资源,使用原型模式可以避免不必要的开销。
  2. 创建对象需要很多时间:当对象的创建过程非常耗时时,原型模式可以提供一种快速的创建方式。
  3. 对象创建需要特定环境或条件:在某些情况下,对象的创建依赖于特定环境或条件,原型模式可以简化这一过程。

6. 总结

原型模式是一种强大的设计模式,它可以显著提高对象创建的效率,特别是在对象创建成本较高或需要特定条件时。通过实现 Cloneable 接口和重写 clone() 方法,我们可以轻松地在Java中实现原型模式。希望本文能帮助你更好地理解和应用原型模式。

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

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

相关文章

刚开始学精益六西格玛管理方法?这份指南建议收藏

精益六西格玛管理方法,作为两大管理哲学的完美结合,正逐渐成为众多企业转型升级的利器。对于刚开始接触这一领域的你来说,掌握精益六西格玛管理的精髓并有效应用于实践中,无疑是一项既具挑战性又极具价值的任务。本文,…

应用连接错误,初始化mysql数据库恢复---惜分飞

有人在部署一个新网站的时候,写错了配置信息,直接导致原有数据库被清掉,并创建了新库和写入了数据(其实本质就是drop table恢复) 登录操作系统查看,发现数据库文件在根分区,创建了新库,写入了数据之外,还有几个G的binlog.全部恢复不太可能,最后客户决定需要恢复的2个核心表数…

.NET 一款在线解密Web.config的脚本

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

官网下载easyx压缩包,如何在devc++配置easyx

视频教程 官网下载easyx压缩包,如何在devc配置easyx EasyX Graphics Library for C 安装指南 1. 访问官网 官网 2. 下载 EasyX 在官网上找到下载区域,点击下载按钮以获取 EasyX 安装包。 3. 访问更多下载选项 点击页面上的“more”链接&#xff0…

Django日志

【图书介绍】《Django 5企业级Web应用开发实战(视频教学版)》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战(视频教学版)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) Django 5框…

uniapp 微信小程序自定义tabbar层级低于canvas解决方案

示例代码&#xff1a; <template><cover-view class"tab"><cover-view class"navView" tap"switc(/pages/index/index)"><cover-image :src"tabname index?/static/tabbar/overide-sel.png:/static/tabbar/overide…

Vscode python无法转到函数定义

今天上午换了电脑&#xff0c;使用Vscode发现找不到对应的函数定义了。 使用了网上的全部教程。一点用没有。重启电脑&#xff0c;重启Vscode也没有作用。最后通过重装vscode&#xff0c;解决问题。&#xff08;也不知道Vscode什么毛病&#xff09; 重点语句&#xff1a; 去官网…

大语言模型(LLM)与多模态大模型(MLLM)结合行人重识别(Reid)领域最新文献方法调研

Data Augmentation for Text-based Person Retrieval Using Large Language Models 这篇论文主要研究文本基础的人员检索&#xff08;Text-based Person Retrieval, TPR&#xff09;任务中的数据扩充问题&#xff0c;并提出了一种基于大语言模型&#xff08;Large Language Mo…

framebuffer帧缓存

1. framebuffer Framebuffer&#xff08;帧缓冲区&#xff09;是用于存储图像数据的一块内存区域。我们可以将我们想要显示的图像数据写到framebuffer中&#xff0c;驱动程序每隔一段时间会自动的去读取Framebuffer中的图像数据&#xff0c;并根据读取到的图像数据在屏幕上显示…

最全整理:R/Rstudio/R包的更新

R 是开源的数据分析和统计计算语言&#xff0c;功能强大且应用广泛&#xff0c;R 的版本更新频率较高。最近处理数据时突然有一个 R 包无法安装&#xff0c;细探究发现这个 R 包需要新版本 R 的才可以安装。本文主要分享&#xff1a;更新 R、更新 Rstudio 和一键升级 R 包。 更…

web项目如何部署到服务器上呢?——麻烦的方法

只需关注web项目如何部署到服务器上&#xff0c;因为服务器运行时就可以访问web项目了。 一、麻烦的方法 1、首先启动服务器 &#xff08;1&#xff09;找到bin文件夹 &#xff08;2&#xff09;双击运行startup.bat文件 &#xff08;3&#xff09;运行之后的界面如下&#…

上海亚商投顾:沪指探底回升 华为产业链午后爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日探底回升&#xff0c;深成指、创业板指盘中跌逾1%&#xff0c;午后集体拉升翻红。华为产业链午后走强…

Mysql系列-索引简介

索引是排好序的数据结构 1 索引数据结构 hash索引、二叉树、平衡二叉树、B-Tree、BTree 数据结构在线示例&#xff1a;点击跳转 2 索引类型 2.1 聚簇索引 又叫“聚集索引” &#xff0c;索引和数据存储在一起 2.2 非聚簇索引 又叫“非聚集索引” &#xff0c;索引和数据分开…

Linux系统玩ppsspp

安装ppsspp 在ppsspp的官网&#xff0c;有提供Linux版本的下载链接&#xff0c;仔细一看是flathub的链接&#xff0c;也就是说ppsspp官方推荐采用flatpak安装。 确实有一些发行版提供了自己的ppsspp包&#xff0c;比如说openSUSE和Fedora&#xff0c;不过我自己试用以后发现系…

我的创作纪念日——第0x100天

官方提示今天是开始创作的第256天&#xff0c;最初没反应过来第256天算是个什么纪念日&#xff0c;好像并没什么特殊的啊。仔细一想&#xff0c;难道是第0x100天的意思吗&#xff1f;哈哈&#xff0c;专属于程序猿的浪漫。 既然这样&#xff0c;还是写一篇文章&#xff0c;交个…

前端使用 Konva 实现可视化设计器(22)- 绘制图形(矩形、直线、折线)

本章分享一下如何使用 Konva 绘制基础图形&#xff1a;矩形、直线、折线&#xff0c;希望大家继续关注和支持哈&#xff01; 请大家动动小手&#xff0c;给我一个免费的 Star 吧~ 大家如果发现了 Bug&#xff0c;欢迎来提 Issue 哟~ github源码 gitee源码 示例地址 矩形 先上效…

实现C程序绑定TCP端口

实现C程序绑定TCP端口 步骤概述伪代码C代码实现解释在网络编程中,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。绑定TCP端口是服务器端应用程序在网络通信中的一个关键步骤,它允许服务器监听来自客户端的连接请求。 本文将介绍如何使用C语言…

Caffenie配合Redis做两级缓存

一、什么是两级缓存 在项目中。一级缓存用Caffeine&#xff0c;二级缓存用Redis&#xff0c;查询数据时首先查本地的Caffeine缓存&#xff0c;没有命中再通过网络去访问Redis缓存&#xff0c;还是没有命中再查数据库。具体流程如下 二、简单的二级缓存实现-v1 目录结构 2…

基于SpringBoot+Vue+MySQL的房屋租赁管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域的鸿沟&#xff0c;信息的…

uniapp 携带网址跳转webview页面报错解决

然后红框中的代码正常执行的 解决方案&#xff1a; 向webview页面携带参数时做以下处理&#xff1a; 接参后做以下处理&#xff1a; 效果展示&#xff1a;