当前位置: 首页 > news >正文

java享元模式

在Java中实现享元模式,可以通过创建一个享元工厂(FlyweightFactory)和享元对象(Flyweight)来完成。享元模式用于共享可复用对象,以节省内存和提高性能。

下面是一个简单的示例:

首先,我们创建一个享元接口(Flyweight):

public interface Flyweight {
    void operation();
}
然后,我们创建具体享元类(ConcreteFlyweight),实现享元接口,并在其中实现具体的操作:

public class ConcreteFlyweight implements Flyweight {
    private String intrinsicState;

    public ConcreteFlyweight(String intrinsicState) {
        this.intrinsicState = intrinsicState;
    }

    @Override
    public void operation() {
        System.out.println("具体享元对象,内部状态为:" + intrinsicState);
    }
}
接下来,我们创建享元工厂类(FlyweightFactory),用于创建和管理享元对象。在享元工厂中,我们使用一个 Map 来存储已经创建的享元对象,确保相同内部状态的享元对象只被创建一次:

import java.util.HashMap;
import java.util.Map;

public class FlyweightFactory {
    private Map<String, Flyweight> flyweights;

    public FlyweightFactory() {
        flyweights = new HashMap<>();
    }

    public Flyweight getFlyweight(String intrinsicState) {
        if (!flyweights.containsKey(intrinsicState)) {
            Flyweight flyweight = new ConcreteFlyweight(intrinsicState);
            flyweights.put(intrinsicState, flyweight);
        }
        return flyweights.get(intrinsicState);
    }
}
现在,我们可以使用享元模式来共享享元对象。首先,创建一个享元工厂对象,并使用享元工厂获取享元对象。由于相同内部状态的享元对象只会被创建一次,所以多个客户端使用相同内部状态的享元对象将共享同一个对象:

public class Main {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();

        Flyweight flyweight1 = factory.getFlyweight("state1");
        flyweight1.operation();

        Flyweight flyweight2 = factory.getFlyweight("state2");
        flyweight2.operation();

        Flyweight flyweight3 = factory.getFlyweight("state1");
        flyweight3.operation();
    }
}
输出结果:

具体享元对象,内部状态为:state1
具体享元对象,内部状态为:state2
具体享元对象,内部状态为:state1


这个例子展示了享元模式的实现方式。通过创建享元接口、具体享元类和享元工厂,可以实现共享享元对象,节省内存和提高性能,尤其在存在大量相似对象时,享元模式能够显著减少对象的数量。

相关文章:

java享元模式

在Java中实现享元模式&#xff0c;可以通过创建一个享元工厂&#xff08;FlyweightFactory&#xff09;和享元对象&#xff08;Flyweight&#xff09;来完成。享元模式用于共享可复用对象&#xff0c;以节省内存和提高性能。 下面是一个简单的示例&#xff1a; 首先&#xff…...

ESP32(MicroPython) 两轮差速五自由度机械臂小车

这次的项目在软件上没多少调整&#xff0c;但本人希望分享一下硬件上的经验。 小车使用两轮差速底盘&#xff0c;驱动轮在小车中间&#xff0c;前后都要万向轮。这种形式可以实现0转弯半径&#xff0c;但受万向轮及用于加高的铜柱的规格限制&#xff0c;两个万向轮难以调到相同…...

mysql基本函数(五)

目录 一、数字函数二、字符函数三、日期时间函数3.1 获取系统日期时间的函数3.2 日期格式化函数3.3 日期偏移计算3.4 日期之间相隔的天数 四、条件函数4.1 IF语句4.2 条件语句 一、数字函数 函数功能用例ABS绝对值ABS(-100)ROUND四舍五入ROUND(4.62)FLOOR向下取值FLOOR(9.9)CE…...

liteflow 2.10 配置中心简单记录

除nacos是一个key 同时管理chain和script node外,可以理解为配置文件整体放到一个key下nacos下的文件必须是xml格式,系统只实现了xml parser其它etcd,zk,Apollo 是两个namespace/path(chain及script node各一)下多个key,每个key对应一个chain/node所有配置中心的核心代码…...

【C++】引用、内联函数等

文章目录 一、引用1.引用概念2.引用特性3.引用时的权限问题4 .使用场景5 .引用和指针的联系与区别 二、内联函数1.概念2.注意点 三、auto关键字1.概念2.auto的使用细则 四、 基于范围的for循环1.概念2.范围for的使用条件 五、 指针空值nullptr1.概念2.使用注意 一、引用 1.引用…...

RocketMQ教程-(4)-主题(Topic)

本文介绍 Apache RocketMQ 中主题&#xff08;Topic&#xff09;的定义、模型关系、内部属性、行为约束、版本兼容性及使用建议。 定义​ 主题是 Apache RocketMQ 中消息传输和存储的顶层容器&#xff0c;用于标识同一类业务逻辑的消息。 主题的作用主要如下&#xff1a; 定义…...

睡眠健康数据分析

项目背景 背景描述 本数据集涵盖了与睡眠和日常习惯有关的诸多变量。如性别、年龄、职业、睡眠时间、睡眠质量、身体活动水平、压力水平、BMI类别、血压、心率、每日步数、以及是否有睡眠障碍等细节。 数据集的主要特征&#xff1a; 综合睡眠指标&#xff1a; 探索睡眠持续时…...

Spring Boot 3.x 系列【47】启动流程 | 启动监听器

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.1.0 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 文章目录 1. 前言2. 核心类2.1 SpringApplicationRunListener2.2 ApplicationStartup2.3 ApplicationListener3. 执行流程3.1 获取监…...

【KD】知识蒸馏与迁移学习的不同

知识蒸馏与迁移学习的不同 (1)数据域不同. 知识蒸馏中的知识通常是在同一个目标数据集上进行迁移&#xff0c;而迁移学习中的知识往往是在不同目标的数据集上进行转移. (2)网络结构不同. 知识蒸馏的两个网络可以是同构或者异构的&#xff0c;而迁移学习通常是在单个网络上利用其…...

计算机内存中的缓存Cache Memories

这篇写一下计算机系统中的缓存Cache应用场景和实现方式介绍。 Memory hierarchy 在讲缓存之前&#xff0c;首先要了解计算机中的内存结构层次Memory hierarchy。也就是下图金字塔形状的结构。 从上到下&#xff0c;内存层次结构如下&#xff1a; 寄存器&#xff1a;这是计算机…...

Flask的send file和send_from_directory的区别

可以自行查看flask 文档。 send file高效&#xff1b; send from directory安全&#xff0c;且适用于静态资源交互。 都是实现相同的功能的。 send_file send_from_directory...

Java 队列

基本介绍 数组模拟队列 思路分析 代码实现 import java.util.Scanner;public class Test {public static void main(String[] args) {// 创建一个队列ArrayQueue queue new ArrayQueue(3);int select;Scanner scanner new Scanner(System.in);boolean loop true;while (lo…...

【算法基础:搜索与图论】3.6 二分图(染色法判定二分图匈牙利算法)

文章目录 二分图介绍染色法判定二分图例题&#xff1a;860. 染色法判定二分图 匈牙利匹配二分图最大匹配匈牙利匹配算法思想例题&#xff1a;861. 二分图的最大匹配 二分图介绍 https://oi-wiki.org/graph/bi-graph/ 二分图是图论中的一个概念&#xff0c;它的所有节点可以被…...

SpringMVC 怎么和 AJAX 相互调用的

通过 Jackson 框架就可以把 Java 里面的对象直接转化成 Js 可以识别的 Json 对象。 步骤如下 &#xff1a; a、加入 Jackson.jar b、在配置文件中配置 json 的映射 c、在接受 Ajax 方法里面可以直接返回 Object,List 等,但方法前面要加上ResponseBody 详细步骤&#xff1a; …...

UCDOS和WPS推动计算机领域的汉字化发展,中文编程该谁力扛大旗?

你还记得UCDOS吗&#xff1f; 从DOS时代过来的人&#xff0c;还知道UCDOS的&#xff0c;现在可能已经是中年人了&#xff01; 当时&#xff0c;鲍岳桥的UCDOS可以称得上是中国的国产操作系统。 在Windows还没来得及进入中国市场时&#xff0c;UCDOS可以说是走向了巅峰时刻&a…...

golang+layui提升界面美化度--[推荐]

一、背景 golanglayui提升界面美化度--[推荐]&#xff1b; golang后端写的页面很难看&#xff0c;如何好看点呢&#xff0c;那就是layui https://layui.dev/ 也是一个简单上手容易使用的框架&#xff0c;类似jquery&#xff0c;对于后端开发来说满足使用需求 二、使用注意点…...

42. 接雨水

题目介绍 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3…...

Python学习阶段路线和内容

Python学习阶段路线和内容 这是我的看法和认识&#xff0c;供参考。 Python学习路线主要分为三个阶段&#xff1a;入门阶段、提高阶段和深入阶段。 入门阶段 入门阶段需要学习Python的基本语法&#xff0c;掌握变量和数据类型、条件语句和循环语句、函数和模块等内容。并通过…...

RocketMQ教程-安装和配置

Linux系统安装配置 64位操作系统&#xff0c;推荐 Linux/Unix/macOS 64位 JDK 1.8 Maven3.0 yum 安装jdk8 yum 安装maven 1.下载安装Apache RocketMQ RocketMQ 的安装包分为两种&#xff0c;二进制包和源码包。 点击这里 下载 Apache RocketMQ 5.1.3的源码包。你也可以从这…...

【LeetCode】55.跳跃游戏

题目 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例 1&#xff1a; 输入&#xff1a;nums [2,3,1,1,4] 输出&#xff1a;true 解释&#xff1a;可以…...

保姆级教程:用Zephyr RTOS 3.x和nRF52832开发板,5分钟跑通你的第一个BLE心率监测应用

从零构建基于Zephyr RTOS的BLE心率监测系统&#xff1a;nRF52832开发实战指南 在物联网和可穿戴设备爆发的时代&#xff0c;低功耗蓝牙&#xff08;BLE&#xff09;技术已成为连接智能设备的重要纽带。对于嵌入式开发者而言&#xff0c;掌握BLE开发意味着打开了通往智能硬件世界…...

OpenClaw问题排查大全:百川2-13B-4bits量化模型接入常见错误

OpenClaw问题排查大全&#xff1a;百川2-13B-4bits量化模型接入常见错误 1. 问题排查前的准备工作 在开始排查OpenClaw与百川2-13B-4bits量化模型对接的问题前&#xff0c;我们需要先确认几个基础环境要素。这些准备工作往往能帮我们快速排除50%以上的低级错误。 首先检查Op…...

GLM-OCR硬件优化指南:为GPU部署调整显存与算力配置

GLM-OCR硬件优化指南&#xff1a;为GPU部署调整显存与算力配置 如果你正在尝试部署GLM-OCR模型&#xff0c;是不是也遇到过这样的困惑&#xff1a;明明选了看起来不错的GPU&#xff0c;但推理时要么爆显存&#xff0c;要么速度慢得让人着急&#xff0c;钱花了效果却没达到预期…...

单电源运放电路设计要点与实践指南

1. 单电源运放电路设计基础 运算放大器作为模拟电路设计的核心器件&#xff0c;其供电方式直接影响电路性能表现。与双电源供电相比&#xff0c;单电源供电方案在实际工程应用中更为常见&#xff0c;但设计时需要特别注意以下几个关键点&#xff1a; 1.1 供电架构差异解析 双…...

基于LabVIEW的纯软件信号发生器功能介绍

基于labview的信号发生器 功能介绍&#xff1a;纯软件方面的信号发生器&#xff0c;没有引入NI外部模块&#xff0c;生成的信号只在示波器中显示。 包括高斯白噪声、正弦波、方波、锯齿波、三角波、均匀白噪声、自定义公式&#xff0c;通过枚举按钮选择生成信号类型&#xff0c…...

效率神器:用快马AI将antigravity彩蛋变为你的趣味开发效率工具

今天想和大家分享一个提升开发效率的小技巧——把Python里经典的antigravity彩蛋变成日常开发的趣味工具。这个想法源于我发现很多开发者&#xff08;包括我自己&#xff09;在紧张的工作中容易陷入枯燥的重复劳动&#xff0c;而一些小小的趣味互动其实能有效缓解疲劳&#xff…...

Visio是什么?附安装使用全流程

Visio是什么&#xff1f; 它是微软出品的专业图表绘制工具&#xff0c;是Office家族里最低调、但也是职场进阶最硬核的成员之一。如果说Excel是处理数字的神&#xff0c;那Visio就是处理逻辑和流程的王者。 安装教程和安装包获取 为什么建议你试试Visio&#xff1f; 1. 拖拽…...

AI显微镜-Swin2SR惊艳效果展示:JPG噪点去除+边缘重构真实案例

AI显微镜-Swin2SR惊艳效果展示&#xff1a;JPG噪点去除边缘重构真实案例 1. 引言&#xff1a;当模糊图片遇见AI“脑补” 你有没有遇到过这种情况&#xff1f;翻出多年前的老照片&#xff0c;却发现它模糊不清&#xff0c;布满了马赛克和噪点&#xff1b;或者从网上下载了一张…...

告别粗糙模型:3DReshaper点云重建、平滑与精准测量的实战指南

1. 为什么你的点云模型总是粗糙不平&#xff1f; 每次处理点云数据时&#xff0c;最让我头疼的就是重建后的模型表面总是坑坑洼洼&#xff0c;像月球表面一样。这个问题困扰了我整整三个月&#xff0c;直到发现了3DReshaper这个神器。你可能也遇到过类似情况&#xff1a;花大价…...

音频频谱分析师的成长之路:Spek实战秘籍深度解锁

音频频谱分析师的成长之路&#xff1a;Spek实战秘籍深度解锁 【免费下载链接】spek Acoustic spectrum analyser 项目地址: https://gitcode.com/gh_mirrors/sp/spek 你是否曾好奇专业音频工程师如何"看见"声音&#xff1f;当音乐制作人谈论"频率冲突&qu…...