享元模式介绍(含案例代码)

学习目标:

  • 了解享元模式

学习内容:

享元模式(Flyweight Pattern)是一种结构型设计模式,旨在减少创建对象的数量,以节省内存和提高性能。这个模式通过共享尽可能多的细节来有效地支持大量细粒度对象。

享元模式的基本思想

享元模式通过将多个对象的共享部分提取出来,只保留它们之间的差异,从而减少内存的使用。这种共享的部分称为“享元”(Flyweight),而不共享的部分则称为“非享元状态”。

享元模式的结构

  • 享元接口(Flyweight Interface):定义了享元对象的方法,可以接收并作用于外部状态。
  • 具体享元类(Concrete Flyweight Class):实现享元接口,并且存储对象的内部状态。具体享元对象是可以共享的。
  • 非共享具体享元类(Unshared Concrete Flyweight Class):并非所有的具体享元对象都可以共享,非共享具体享元类就是那些不需要共享的类。
  • 享元工厂(Flyweight Factory):负责创建和管理享元对象,确保合理地共享享元对象。工厂类通过一个存储已经创建的享元对象的池来维护这些对象。

享元模式的实现

享元模式的实现可以分为两个状态:内部状态和外部状态。内部状态是存储在享元对象内部的共享状态,不会随环境改变而改变;外部状态是随环境改变的不可共享状态,必须由客户端自行维护。

示例代码

// 享元接口
public interface Flyweight {void operation(String externalState);
}// 具体享元类
public class ConcreteFlyweight implements Flyweight {private String intrinsicState;public ConcreteFlyweight(String intrinsicState) {this.intrinsicState = intrinsicState;}@Overridepublic void operation(String externalState) {System.out.println("Intrinsic State = " + intrinsicState + ", External State = " + externalState);}
}// 享元工厂
import java.util.HashMap;
import java.util.Map;public class FlyweightFactory {private 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("A");flyweight2.operation("Second Call");Flyweight flyweight3 = factory.getFlyweight("B");flyweight3.operation("Third Call");}
}

使用场景

  • 系统中有大量相似对象:这时可以使用享元模式来减少对象的数量。
  • 对象的数量使得内存消耗过大:通过共享对象,可以显著减少内存使用。
  • 大部分对象的状态可以外部化:即对象的外部状态可以由客户端来维护。

优点

  • 减少对象的创建:通过共享对象,减少了系统中对象的数量,节省了内存。
  • 提高性能:减少了内存消耗和垃圾回收的负担,从而提升了系统的性能。

缺点

  • 增加了系统的复杂性:需要分离内部状态和外部状态,并且客户端需要维护外部状态。
  • 使代码更加难以理解和维护:享元模式的实现需要较高的抽象和设计技巧。

总的来说,享元模式在需要高效管理大量相似对象的场景下非常有用,但在实现时需要仔细设计以平衡性能和复杂性。


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

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

相关文章

PTA 7-7 后序和中序构造二叉树

本题目要求用后序序列和中序序列构造一棵二叉树&#xff08;树中结点个数不超过10个&#xff09;&#xff0c;并输出其先序序列。 输入格式: 在第一行中输入元素个数。 第二行中输入后序序列&#xff0c;用空格分隔。 第三行中输入中序序列&#xff0c;用空格分隔。 输出格…

Go 编程风格指南 - 最佳实践

Go 编程风格指南 - 最佳实践 原文&#xff1a;https://google.github.io/styleguide/go 概述 | 风格指南 | 风格决策 | 最佳实践 注意&#xff1a; 本文是 Google Go 风格 系列文档的一部分。本文档是 规范性(normative) 但不是强制规范(canonical)&#xff0c;并且从属于Goo…

C# type.GetProperty使用 Type.GetProperties() 获取不到值的解决方法

C# type.GetProperty使用 Type.GetProperty 方法用于获取当前 Type 的指定属性。它接受一个字符串参数&#xff0c;该字符串是你要获取的属性的名称。如果找到了匹配的属性&#xff0c;它会返回一个 PropertyInfo 对象&#xff1b;如果没有找到&#xff0c;它会返回 null。 下…

进入mysql报错:bash:/bin/mysql:没有那个文件或目录

问题分析&#xff1a; 有可能把/bin下面的mysql文件删除 解决方案&#xff1a; 卸载已安装MySQL&#xff0c;重新安装一遍 卸载步骤&#xff1a; 在CentOS系统中卸载MySQL可以通过以下步骤进行&#xff1a; 1、停止MySQL服务&#xff1a; sudo systemctl stop mysqld 2…

【GD32F303红枫派使用手册】第七节 TIMER-蜂鸣器PWM

7.1 实验内容 通过本实验主要学习以下内容&#xff1a; PWM输出功能实现&#xff1b; 定时器基本原理&#xff1b; 蜂鸣器驱动原理&#xff1b; 7.2 实验原理 7.2.1 蜂鸣器驱动原理 蜂鸣器是一种一体化结构的电子讯响器&#xff0c;采用直流电压供电&#xff0c;广泛应用…

数仓建模—指标体系初识

文章目录 数仓建模—指标体系初识什么是指标如何理解指标体系指标体系的价值指标体系的构建构建原则与规范指标体系的分类指标体系构建步骤指标体系挑战与对策总结数仓建模—指标体系初识 指标体系是一套系统化、结构化的指标集合,用于衡量、评估、监控组织或项目的整体情况。…

2024年信息素养大赛图形化编程小低组复赛模拟真题

2024年全国青少年信息素养大赛复赛为六道编程题&#xff0c;分值为10分*215分*225分*2&#xff0c;难度依次递增&#xff0c;按步骤评分&#xff0c;据Scratch实验室预估&#xff0c;初赛80%的晋级率&#xff0c;初赛近20万人&#xff0c;意味着有15万多进入复赛&#xff0c;7月…

bootstrapblazor小白笔记

使用了bootstrapblazor&#xff0c;采用.net8.0&#xff0c;server模式&#xff0c;所有的问题都是基于以上条件所遇到的 1、登录过后需要在每个页面都使用认证吗 是不需要的&#xff0c;每个页面都写attribute [Authorize]没有问题&#xff0c;但是页面很多的话一个一个的写很…

私有化部署的无忧企业文档,助力企业实现文档权限的精细化管理

在当今数字化快速发展的时代&#xff0c;企业文档管理已成为企业运营中不可或缺的一部分。文档的安全性和访问权限的精确控制对于企业的信息保护至关重要。在无忧企业文档管理系统中&#xff0c;不仅具备强大的内容管理能力&#xff0c;更在权限管理上做到了细致入微。下面我对…

C++ 宏定义中的##

一、解释 C的宏定义中的##&#xff0c;代表将内容先分隔&#xff0c;再强制连接。 二、举例 假设有如下宏定义&#xff1a; #define DECLARE(name, type) type name##_##type##_typevoid decl() {DECLARE(val, int); //语句1 } 则语句1替换为&#xff1a;int val_int_type 由…

【MySQL】MySQL Connect -- 详解

一、Connector / C 使用 要使用 C 语言连接 MySQL&#xff0c;需要使用 MySQL 官网提供的库&#xff0c;可以去官网进行下载&#xff1a;MySQL :: MySQL Community Downloads 我们使用 C 接口库来进行连接&#xff0c;要正确使用&#xff0c;还需要做一些准备工作&#xff1a…

[Windows] 植物大战僵尸杂交版

游戏包含冒险模式、挑战模式、生存模式三种不同玩法。冒险模式主打关卡闯关&#xff0c;挑战模式则挑战特殊设计的关卡&#xff0c;生存模式结合无尽模式和特殊地图&#xff0c;各具特色。玩家可根据喜好自由选择模式&#xff0c;体验不同的游戏乐趣。快来尝试这款独特的pvz游戏…

【2024-06-03】某红书X-s分析

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、【2023-02-24】版本1.网站分析2.参数x-s3.web_session4.测试三、【2024-06-03】 版本1. 抓包流程2.简单分析…

springboot学习笔记-待整理

学习方式&#xff1a;看博客学习&#xff0c;记录博客链接&#xff0c;并整理干货知识点。 参考的博客&#xff1a;SpringBoot框架 Spring Boot最主要作用是帮我们快速的构建庞大的spring项目&#xff0c;并且尽可能的减少一切xml配置&#xff0c;做到开箱即用&#xff0c;迅…

对GPT-4o的评价:技术革新与未来展望

目录 引言一、GPT-4o的技术背景1.1 GPT系列的发展历程1.2 GPT-4o的技术特点 二、版本间的对比分析2.1 GPT-3与GPT-4的对比2.2 GPT-4与GPT-4o的对比 三、GPT-4o的技术能力3.1 自然语言处理3.2 多模态处理3.3 任务定制化 四、个人整体感受4.1 交互体验4.2 应用场景4.3 未来展望 五…

C++_deque:deque的数据结构特点

文章目录 &#x1f680;1. deque介绍&#x1f680;2. deque数据结构&#x1f680;3. deque的缺陷&#x1f680;4.为什么选择deque作为stack和queue的底层默认容器&#x1f680;5.deque头插逻辑&#xff08;了解&#xff09; 大家好&#xff01;本文会简单讲讲deque的使用与数据…

会计事务所巨头普华永道,大量内部文件泄露

据安全机构监测显示&#xff0c;“四大”会计师事务所之一的普华永道&#xff08;PwC&#xff09;遭遇数据泄露&#xff0c;18900份内部档案被公开&#xff0c;文件大小共222GB。泄露的文件包括客户评审文件、人力资源文件和员工文件。 据了解&#xff0c; 普华永道&#xff0…

html + js 实现单个标签内文本大小不一样的效果

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>价格显示示例</title><style>.small {font-size: 0.7em; /* 设置较小的字体大小 */color:red;}#price{color:red;}</style> <…

第24讲:Ceph集群RGW对象存储高可用集群部署与测试

文章目录 1.RGW对象存储高可用集群架构1.1.环境规划1.2.高可用集群架构图 2.部署RGW对象存储高可用集群2.1.在所有的Ceph节点中部署RGW2.2.部署Haproxy负载均衡服务2.3.配置Haproxy负载均衡三个节点中的RGW2.4.配置Keepalived实现RGW高可用集群2.5.启动Keepalived并观察VIP地址…

python通过自相关对两个时序数据进行匹配、对时

目录 1. 背景2. 代码3. 计算相关性4. 谁在前、谁在后5. 对时数据处理6. 函数介绍代码解读1. 背景 为了数据源一 125m 高度的风速 ws_125 与数据源二 125m 高度的风速 ws_125-2 进行“对时”处理,可以通过计算两个时间序列之间的相关性来确定最佳时间滞后。通常可以使用 Pears…