享元模式实战运用

news2024/11/19 15:34:37

前言

享元模式,将程序中可能反复创建且种类固定的对象缓存起来,以便共享。

通常使用一个享元工厂来创建和缓存享元对象,保证享元类的一个实例只能被创建一次,客户端获取享元对象时,先查看对象是否已经创建,若已经创建,则直接从缓存中获取,否则创建新的对象返回并缓存起来。

实战代码

Integer

JDK Integer 类就使用了享元模式,valueOf 方法将 int 转换为 Integer 对象,从源代码中可以看出来,-128 到 127 这区间内的 int 值是直接从 IntegerCache 中获取的,并不会新建 Integer 对象

IntegerCache 是 Integer 里的静态内部类,可以看到在加载时,便将 -128 到 127 区间创建了对象并缓存起来了。

这么设计的原因是 -128 到 127 这个区间的数值十分常用,就没有必要每次使用时都去新建一个新的 Integer 对象,将该区间的值当作享元对象,即节省了内存空间,也提升了性能。

实战

Integer 类的静态内部类 IntegerCache,实际上就是享元模式中的享元工厂,而区间 [-128, 127] 的整型值就是享元对象。

在实际业务中,只要能抽象出业务的共享对象,再实现与之配套的享元工厂

Flyweight


public interface Flyweight {}

ConcreteFlyweight


public class ConcreteFlyweight implements Flyweight {
  
    private String attr1;
 
    private String attr2;
 
    public ConcreteFlyweight(String attrs) {
        String[] as = attrs.split(",");
        attr1= as[0];
        attr2= as[1];
    }
    public String getAttr1() {
        return this.attr1;
    }
    public String getAttr2() {
        return this.attr2;
    }
}

FlyweightFactory

public class FlyweightFactory {
    private static FlyweightFactory factory = new FlyweightFactory();
    private FlyweightFactory() {}
    public static FlyweightFactory getInstance() {
        return factory;
    }
    /**
     * 缓存享元对象
     * 这里直接使用本地缓存,实际项目中使用 redis 等等
     */
    private Map<String, Flyweight> map = new HashMap<>();
    /**
     * 获取 key 对应的享元对象
     * @param key 获取享元对象的key
     * @return key对应的享元对象
     */
    public synchronized Flyweight getFlyweight(String key) {
        // 先从缓存中查找,是否存在 key 对应的 Flyweight 对象
        Flyweight obj = map.get(key);

        if (null == obj) {
            // 不存在,则创建一个新的 Flyweight 对象,并缓存
            obj = new ConcreteFlyweight(key);
            map.put(key, obj);
        }
        return obj;
    }
}

测试类

public class ClassForTest {

    public static void main(String[] args) {
        
        String attrs = "attr1,attr2";

        Flyweight obj1 = FlyweightFactory.getInstance().getFlyweight(attrs);
        Flyweight obj2 = FlyweightFactory.getInstance().getFlyweight(attrs);
        
        System.out.println(obj1 == obj2);
        
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

各地省级网信部门受理数据出境安全评估申报、个人信息出境标准合同备案工作的联系方式

各地省级网信部门受理数据出境安全评估申报、个人信息出境标准合同备案工作的联系方式 为了指导和帮助数据处理者规范有序申报数据出境安全评估、备案个人信息出境标准合同&#xff0c;国家网信办将各地省级网信部门接收申报材料、备案材料的办公地址和联系电话公布如下&#x…

基于Linux内核的socket编程(TCP)的C语言示例

原文地址&#xff1a;https://www.geeksforgeeks.org/socket-programming-cc/ 服务端&#xff1a; #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <unistd.h>#…

BI让数据分析不在困难,分解企业数据分析流程

一、数据培养 数据分析最关键的是什么&#xff1f;其实从名字上就可以看出来&#xff0c;数据是一切的关键&#xff0c;没有数据的话数据分析从何谈起呢。但数据的积累不是一天两天就能成功的&#xff0c;企业的一定要有培养数据的意识&#xff0c;在业务活动中沉淀数据&#…

【目标检测】2. RCNN

接上篇 【目标检测】1. 目标检测概述_目标检测包括预测目标的位置吗?-CSDN博客 一、前言 CVPR201 4经典paper:《 Rich feature hierarchies for accurate object detection and semantic segmentation》&#xff0c;https://arxiv.org/abs/1311.2524, 这篇论文的算法思想被称…

vue组件化开发流程梳理,拿来即用

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Revit二次开发-导出DWG设置

Revit二次开发 笔记 导出DWG ///导出Dwg/CADIList<string> setups DWGExportOptions.GetPredefinedSetupNames(doc);//获取当前导出已设置的类型DWGExportOptions dwgoptins DWGExportOptions.GetPredefinedOptions(doc, setups.LastOrDefault());//获取指定setups nam…

MybatisPlus-Generator自定义模版生成CRUD、DTO、VO、Convert等

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 简介 如标题所言&#xff0c;本篇文章介绍如何使用MybatisPlus-Generator自定义模版生成CRUD、DTO、V…

GRACE:梯度引导的可控检索增强基于属性的生成

在本文中&#xff0c;我们提出通过梯度引导的可控检索&#xff08;GRACE&#xff09;来增强基于属性的生成&#xff0c;考虑到目标属性&#xff08;见图1&#xff09;。具体来说&#xff0c;我们训练一个鉴别器来计算给定上下文的属性分布。我们构建了一个检索库&#xff0c;存…

用python写网络爬虫:2.urllib库的基本用法

文章目录 urllib库抓取网页data参数timeout参数更灵活地配置参数登录代理Cookies 参考书籍 建议新入门的小伙伴先看我同一专栏的文章&#xff1a;用python写网络爬虫&#xff1a;1.基础知识 urllib库 urllib是python中一个最基础的HTTP库&#xff0c;一般是内置的&#xff0c;…

数字经济时代,数据清洗不是件小事

对于企业来说&#xff0c;数据无疑是当前时代业务增长和发展决策的核心要素&#xff0c;也是数字经济探索中的基础建设。不过随着数字化的加速普及&#xff0c;企业需要存储、处理的数据越来越多&#xff0c;海量的数据已经让企业难以理解&#xff0c;很难全面进行利用。尤其是…

数字化转型下的新质生产力:赋能未来发展新引擎

1. 引言&#xff1a;数字化转型与新质生产力的交融共生 在信息化、智能化的新时代&#xff0c;数字化转型已经成为推动经济社会发展的重要力量。而新质生产力&#xff0c;作为面向新兴领域和未来产业的先进生产力&#xff0c;正在数字化转型的浪潮中焕发出新的生机与活力。 数…

机器人路径规划:基于深度优先搜索(Depth-First-Search,DFS)算法的机器人路径规划(提供Python代码)

一、深度优先搜索算法介绍 深度优先搜索算法&#xff08;Depth-First-Search&#xff09;的基本思想是沿着树的深度遍历树的节点&#xff0c;尽可能深的搜索树的分支。当节点v的所有边都己被探寻过&#xff0c;搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已…

PTA-练习3

目录 实验4-2-3 换硬币 实验4-2-4 输出三角形字符阵列 实验4-2-5 输出整数各位数字 实验4-2-6 梅森数 实验4-2-7 找完数 实验4-2-9 水仙花数 实验6-2 英文字母替换加密&#xff08;大小写转换后移1位&#xff09; 实验6-5 简单计算器 实验6-10 统计单词的长度 实验4-2…

财富池指标公式--通达信主力资金指标公式,主力资金流向怎么看?

今日分享的通达信主力资金指标公式&#xff0c;是一个分析主力资金进出的指标。 具体信号说明&#xff1a; 当紫色的起涨点主力资金线和红色的拉升资金同时上传0线&#xff0c;并且紫色的拉升线超过资金线&#xff0c;大盘进入派发阶段&#xff0c;后市看涨&#xff0c;是参考…

pinia 的选项式和组合式的不同写法和持久化的方法

pinia 是vue3推荐的状态管理插件&#xff0c;它对标的是vue2中使用的vuex pinia 的引入方法 npm 安装 pinia在 src/store/index.js 中 创建一个pinia 的实例&#xff0c;并导出 在项目中的 main.js 中引入 2 中的pinia 并且使用 app.use(pinia) main.js中 import pinia from…

100天精通Python(实用脚本篇)——第118天:基于selenium和ddddocr库实现反反爬策略之验证码识别

文章目录 专栏导读一、前言二、ddddocr库使用说明1. 介绍2. 算法步骤3. 安装4. 参数说明5. 纯数字验证码识别6. 纯英文验证码识别7. 英文数字验证码识别8. 带干扰的验证码识别 三、验证码识别登录代码实战1. 输入账号密码2. 下载验证码3. 识别验证码并登录 书籍推荐 专栏导读 …

第111讲:Mycat实践指南:固定Hash算法分片下的水平分表详解

文章目录 1.固定Hash算法分片的概念1.1.固定Hash算法的概念1.2.固定Hash算法是如何将数据路由到分片节点的 2.使用固定Hash算法分片对某张表进行水平拆分2.1.在所有的分片节点中创建表结构2.2.配置Mycat实现固定Hash算法分片的水平分表2.2.1.配置Schema配置文件2.2.2.配置Rule分…

VMware虚拟机和主机之间无法复制粘贴,移动文件,重新安装vmware-tools变灰,VMware Tools继续运行脚本未能在虚拟机中成功运行。

起初&#xff0c;虚拟机只是无法和主机之间进行复制粘贴&#xff0c;移动文件。查询了很多资料,反反复复地安装卸载vmware-tools&#xff0c;但是都没有成功。通过这篇文章&#xff1a;虚拟机安装VMware Tools的两种方法_vmware tools有3种安装方式-CSDN博客 安装了vmware_too…

PCIE收发时序了解

文章目录 一、Pcie的发送时序1.1 不带数据的TLP包1.2 带数据的TLP包1.3 连续发送数据的TLP包 二、Pcie的接收时序2.1 不带数据的TLP包2.2 带数据的TLP包2.3 连续接收数据的TLP包 三、riffa框架和用户channel的接口3.1 RX接口波形&#xff1a;3.2 TX接口波形&#xff1a; 一、Pc…

用python写网络爬虫:3.urllib库进一步的使用方法

文章目录 异常处理URLErrorHTTPError设置超时时间 链接的解析、构造、合并urlparse方法urlsplit方法urljoin方法urlencode方法parse_qs方法quote方法 Robots 协议Robots 协议的结构解析协议 参考书籍 在上一篇文章&#xff1a;用python写网络爬虫&#xff1a;2.urllib库的基本用…