享元模式详解:内存优化的利器

news2024/9/27 12:10:56

享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享相同对象来减少内存消耗,从而提高系统性能。享元模式适用于大量细粒度对象的场景,这些对象具有相同或相似的状态。

一,享元模式的结构

享元模式的主要结构包括以下几个部分:

  1. Flyweight(享元接口):定义享元对象的接口。
  2. ConcreteFlyweight(具体享元类):实现享元接口,并为内部状态(共享部分)提供存储空间。
  3. UnsharedConcreteFlyweight(非共享具体享元类):并非所有的享元对象都需要被共享,非共享享元对象可以定义自己的行为。
  4. FlyweightFactory(享元工厂):创建和管理享元对象,确保合理地共享享元。
  5. Client(客户端):使用享元对象。

UML类图:
在这里插入图片描述

二,示例代码

以下是一个简单的Java代码示例,展示了享元模式的实现:

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

// 享元接口
interface Flyweight {
    void operation(String extrinsicState);
}

// 具体享元类
class ConcreteFlyweight implements Flyweight {
    private final String intrinsicState;

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

    @Override
    public void operation(String extrinsicState) {
        System.out.println("Intrinsic State: " + intrinsicState + ", Extrinsic State: " + extrinsicState);
    }
}

// 享元工厂
class FlyweightFactory {
    private final Map<String, Flyweight> flyweights = new HashMap<>();

    public Flyweight getFlyweight(String key) {
        if (!flyweights.containsKey(key)) {
            flyweights.put(key, new ConcreteFlyweight(key));
        }
        return flyweights.get(key);
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();

        Flyweight flyweight1 = factory.getFlyweight("A");
        flyweight1.operation("First Call");

        Flyweight flyweight2 = factory.getFlyweight("B");
        flyweight2.operation("Second Call");

        Flyweight flyweight3 = factory.getFlyweight("A");
        flyweight3.operation("Third Call");

        System.out.println(flyweight1 == flyweight3); // 输出 true
    }
}

三,享元模式的优缺点

优点

  1. 减少内存消耗: 通过共享相同的对象,显著减少了内存消耗。
  2. 提高性能: 减少了对象创建的开销,提高了系统性能。

缺点

  1. 复杂性增加: 引入享元模式后,系统结构变得更加复杂。
  2. 线程安全: 共享对象可能会带来线程安全问题,需要额外处理。

四,享元模式的适用场景

  1. 大量细粒度对象: 系统中需要生成大量细粒度对象,且这些对象的内部状态相同或相似。
  2. 内存敏感的应用: 需要优化内存使用的场景,如图形处理、缓存等。

五,总结

享元模式通过共享相同的对象,减少了内存消耗,提高了系统性能。它适用于大量细粒度对象的场景,但也带来了系统复杂性和线程安全问题。在实际应用中,需要根据具体情况权衡其优缺点,合理使用享元模式。


如果你对设计模式、软件架构、编程技巧等内容感兴趣,欢迎关注我们的同名微信公众号【技术拾光者】。在这里,我们将定期分享最新的技术文章和实用的编程技巧,帮助你不断提升自己的技术水平。

扫描下方二维码,立即关注我们吧!
技术拾光者

感谢你的阅读和支持,我们期待与你在微信公众号上交流更多有趣的技术话题!

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

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

相关文章

NXP i.MX8系列平台开发讲解 - 4.1.5 GNSS篇(五) - GPSD 编译(包含交叉编译)详解

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 文章目录 目录 1. 编译GPSD[Ubuntu] 2. 交叉编译 2.1 解决依赖库编译 2.1.1 libusb 编译 2.1.2 libncurses 编译…

Redis的一些通用指令

首先我们需要先连接客户端服务器&#xff0c;此时我们需要通过redis-cli和redis服务器进行交互&#xff0c;输入ping来确保通路的流畅 &#xff08;一&#xff09;get和set redis中最核心的两个命令就是get和set&#xff0c;get就是根据key来取出对应value&#xff0c;set就是把…

2024年汉字小达人区级自由报名比赛的真实流程图解——和往年比有一个重大变化

今天是2024年9月25日&#xff0c;上海小学生&#xff08;和家长&#xff09;们最关注的赛事之一——美丽汉字中文自修杯第十一届上海市小学生汉字小达人区级自由报名区级比赛正式开始了&#xff01; 虽然今天才是比赛的第一天&#xff0c;但是很多孩子已经摩拳擦掌开始展示自己…

信息安全工程师(18)常见密码算法

前言 常见的密码算法主要分为三大类&#xff1a;对称加密算法、非对称加密算法和摘要算法。 一、对称加密算法 对称加密算法&#xff0c;又称为秘密密钥算法或单密钥算法&#xff0c;是指加密和解密使用相同密钥的加密方式。这种算法的特点是加密速度快&#xff0c;适用于大量数…

【延时队列的实现方式】

文章目录 延时队列JDK自带的延时队列实现Redis实现延迟队列RabbitMQ 延时队列 延时队列 延时队列是一种特殊类型的队列&#xff0c;它允许元素在特定时间间隔后才能被处理。这种队列在处理具有延迟需求的任务时非常有用&#xff0c;例如定时任务、事件驱动系统等 延时队列在项…

Cannon-es.js编程进阶:复杂形状的碰撞

本文目录 前言最终复杂模型碰撞效果1、碰撞事件及休眠事件1.1 前文回顾及代码整改1.2 效果1.3 监听碰撞事件与休眠1.3.1 碰撞事件collide1.3.2 休眠事件sleepy及sleep2、多个形状的组合物体碰撞2.1 效果3、Trimesh3.1 代码3.2 效果前言 我们在Cannon-es.js基础入门:3D 物理碰撞…

新闻媒体宣发套餐扩大影响力和建立品牌形象方法-华媒舍

在当今互联网时代&#xff0c;营销推广是任何企业必须要面对的挑战。而在众多的营销方式中&#xff0c;精准投放和新闻媒体宣发套餐推广成为了越来越受欢迎的选择。本文将从精准投放和新闻媒体宣发套餐推广两个方面进行科普介绍&#xff0c;解析其背后的重要意义和带来的百倍回…

微软宣布弃用WSUS,企业用户尽早准备替换方案

微软最近宣布将逐步弃用Windows Server Update Services (WSUS)&#xff0c;不再为其开发新功能&#xff0c;但会继续支持现有的更新和功能。这一决定对企业客户来说影响深远&#xff0c;尤其是那些依赖WSUS来管理大规模Windows设备更新的组织。 对企业客户的影响 安全性与合规…

如何使用ant design vue的a-select下拉框,实现既能输入内容,也可以下拉选择的效果,apiselect同样适用

修改mode 强烈推荐 代码如下&#xff0c;重点在search和mode <ApiSelectv-if"editableData[record.key]"mode"SECRET_COMBOBOX_MODE_DO_NOT_USE"search"inputinspect":api"problem":params"{projectId:projectId}"showS…

[前端]DOM+CSS+HTML实现水波进度效果

效果展示&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Documen…

PAT甲级-1115 Counting Nodes in a Binary Search Tree

题目 题目大意 给定节点个数&#xff0c;以及每个节点的值&#xff0c;要求构造一棵二叉排序&#xff08;搜索&#xff09;树&#xff0c;并按照规定格式输出最后一层和倒数第二层的节点个数。 思路 二叉排序树的构造方法是递归&#xff0c;但思路类似于二分查找。逐个将n个…

浅克隆与深克隆

1、浅克隆 1.1、什么是浅克隆&#xff1f; 被复制对象的所有变量都含有与原来的对象相同的值&#xff0c;而所有的对其他对象的引用仍然 指向原来的对象(克隆对象与原型对象共享引用数据类型变量)。 如下图所示&#xff1a; 1.2、浅克隆代码实现 类实现接口 Cloneable&#xf…

教育在线答题在线小程序源码系统 PHP+MySQL组合开发源码开源可二次开发 带搭建部署教程

系统概述 教育在线答题在线小程序源码系统是一款专为教育行业设计的&#xff0c;集在线题库管理、智能组卷、在线答题、自动评分、成绩分析等功能于一体的综合性平台。该系统采用PHP作为后端开发语言&#xff0c;结合MySQL数据库进行数据存储与管理&#xff0c;确保了系统的稳…

数据在内存中的存储(下)

目录 前言一、浮点数在内存中的存储1.1 练习1.2 浮点数的存储1.2.1 浮点数存的过程1.2.2 浮点数取的过程 1.3 题目解析 总结 前言 前面一期我们主要说到整形在数据中的存储方式&#xff0c;这期我们来看看浮点数在内存中是如何存储的&#xff0c;话不多说&#xff0c;正文开始…

Proto3 深度解读:Protobuf 的用法与实例分析(C++)

文章目录 1. 前言1.1 序列化和反序列化1.2 什么情况下要进行序列化1.3 部分序列化工具 2. 了解Protobuf2.1 什么是Protobuf2.2 proto 成分2.3 如何编译proto2.4 编译.proto文件后生成的文件都有什么&#xff1f; 3. Protobuf的使用3.1 Protobuf的使用过程3.2 上手编写实例 4. p…

打印沙漏(最蠢的办法)

直接给代码&#xff0c;很好理解的 #include<bits/stdc.h> using namespace std; int s(int b){if(b<1)return 0;if(b2)return 1;for(int i3;i<sqrt(b);i){if(b%i0)return 0;}return 1; } int main(){int n;cin>>n;char c;cin>>c;vector<int>s;…

什么是服务器日志,日志有什么作用?

前言 服务器日志是指服务器等电脑设备或软件的运作记录‌。这些日志记录了服务器接收客户端处理请求的过程以及服务器对这些请求的处理结果。服务器日志对于排查和解决计算机系统和网络应用中的问题至关重要&#xff0c;因为它们包含了用于调试问题的消息、服务器状态以及其他…

深入解析网络通信关键要素:IP 协议、DNS 及相关技术

我的主页&#xff1a;2的n次方_ 1. IP 协议报头结构 4 位版本&#xff1a;表示 IPv4 / IPv6 4 位首部长度&#xff1a;表示 IP 报头的长度&#xff0c;以 4 字节为单位 8 位服务类型&#xff1a;包括 3 位优先权字段&#xff08;已弃用&#xff09;&#xff0c;4 位 TOS 字…

css基础知识(二)

“落座无言行三载&#xff0c;持笔无悔笑苍生&#xff01;” 文章目录 前言文章有误敬请斧正 不胜感恩&#xff01;1. 选择器类型标签选择器类选择器ID选择器通配符选择器复合选择器 2. 元素显示模式块级元素行内元素行内块元素 3. 背景属性4. 字体和文本属性5.垂直居中的实现方…

vue到出excel

安装 npm install exceljs npm install file-saver<template><button click"dade66">导出 66</button> </template><script> import ExcelJS from exceljs; import { saveAs } from file-saver;export default {data() {return {data…