二十三种设计模式第十三篇--享元模式

news2024/11/26 4:40:38

享元模式,主要就是一种池化方案,主要用于创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

享元模式,尝试重用现有的同类对象,如果未找到相同匹配的对象,那么就去创建对象。享元模式的核心思想是共享相同状态的对象,以节省系统资源和内存空间。

在享元模式中,对象分为两种类型:内部状态(Intrinsic State)和外部状态(Extrinsic State)。
内部状态是对象可以共享的不变数据,而外部状态是随着对象上下文的变化而变化的数据。通过将内部状态和外部状态分离,享元模式使得多个对象可以共享相同的内部状态,而外部状态则可以在运行时设置。

使用享元模式的主要目的是在系统中有大量对象并且这些对象的大部分状态是相同的情况下,减少对象的数量,节省内存空间,并提高系统的性能。通过共享相同状态的对象,可以避免重复创建相似的对象,从而减少内存占用。这对于需要创建大量细粒度的对象的场景特别有用,例如富文本编辑器中的字母对象、游戏中的粒子系统等。
在这里插入图片描述

public interface Shape {
   void draw();
}
public class Circle implements Shape {
   private String color;
   private int x;
   private int y;
   private int radius;
 
   public Circle(String color){
      this.color = color;     
   }
 
   public void setX(int x) {
      this.x = x;
   }
 
   public void setY(int y) {
      this.y = y;
   }
 
   public void setRadius(int radius) {
      this.radius = radius;
   }
 
   @Override
   public void draw() {
      System.out.println("Circle: Draw() [Color : " + color 
         +", x : " + x +", y :" + y +", radius :" + radius);
   }
}
public class ShapeFactory {

   //享元
   private static final HashMap<String, Shape> circleMap = new HashMap<>();
 
   public static Shape getCircle(String color) {
      Circle circle = (Circle)circleMap.get(color);
 
      if(circle == null) {
         circle = new Circle(color);
         circleMap.put(color, circle);
         System.out.println("Creating circle of color : " + color);
      }
      return circle;
   }
}
public class FlyweightPatternDemo {
   private static final String colors[] = { "Red", "Green", "Blue", "White", "Black" };

   /**
   我们将创建一个 Shape 接口和实现了 Shape 接口的实体类 Circle。下一步是定义工厂类 ShapeFactory。
   ShapeFactory 有一个 Circle 的 HashMap,其中键名为 Circle 对象的颜色。无论何时接收到请求,都会创建一个特定颜色的圆。
   ShapeFactory 检查它的 HashMap 中的 circle 对象,如果找到 Circle 对象,则返回该对象,否则将创建一个存储在 hashmap 中以备后续使用的新对象,并把该对象返回到客户端。
   FlyWeightPatternDemo 类使用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息(red / green / blue/ black / white),以便获取它所需对象的颜色
    */

   public static void main(String[] args) {

      for(int i=0; i < 20; ++i) {
         Circle circle = (Circle) ShapeFactory.getCircle(getRandomColor());
         circle.setX(getRandomX());
         circle.setY(getRandomY());
         circle.setRadius(100);
         circle.draw();
      }
   }
   private static String getRandomColor() {
      return colors[(int)(Math.random()*colors.length)];
   }
   private static int getRandomX() {
      return (int)(Math.random()*100 );
   }
   private static int getRandomY() {
      return (int)(Math.random()*100);
   }
}

总结来说,享元模式的意图是通过共享对象的方式有效地支持大量细粒度的对象,减少对象的创建和内存占用。它可以提高系统的性能和资源利用率。使用该模式时,需要将对象的内部状态和外部状态进行合理划分,确保内部状态是可以共享的,而外部状态可以在运行时设置。

好处:
这样可以实现对象的共享,避免重复创建相似的对象,从而达到节省内存的目的。

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

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

相关文章

ros2 c++实现JY_95T IMU解算三轴 加速度 角速度 欧拉角 磁力计 四元数

起因&#xff0c;机器人建图导航程序需要做里程计 imu数据融合&#xff0c;需要填充imu数据&#xff0c;但对imu填充的数据一直不是很了解&#xff0c;并且正在学习c的类与对象&#xff0c;新近入手了一款JY_95T IMU&#xff0c;没有ros2的c实现&#xff0c;所幸就拿它练练手&a…

Cocos2dx学习笔记:浅谈游戏内的适配方案

前言 本篇在讲什么 Cocos2dx中的适配方案 本篇适合什么 适合初学Cocos的小白 本篇需要什么 对Lua语法有简单认知 依赖Cocos2dx3.15环境 依赖Sublime Text编辑器 依赖VS 2015编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手…

vue基于SpringBoot的智慧城市社区生活分类信息管理系统的设计与实现_2p760

表名&#xff1a;dongwuzhonglei 功能&#xff1a;动物种类 字段名称 类型 长度 字段说明 主键 默认值 id bigint 主键 主键 addtime timestamp 创建时间 CURRENT_TIMESTAMP dongwuzhonglei varchar 200 动物种类 …

防止video视频被下载的几种处理办法

1&#xff0c;video禁用下载功能 <video controlslist"nodownload"></video>2&#xff0c;隐藏鼠标右键&#xff0c;禁止复制链接 document.oncontextmenu function () {return false; }3&#xff0c;使用云点播等第三方播放控件&#xff0c;最好的话…

图像增强算法Retinex原理与实现详解

文章目录 1. 引言2. Retinex算法原理2.1 单尺度Retinex示例代码 2.2 多尺度Retinex示例代码 2.3 颜色恢复示例代码 2.4 最终图像处理代码示例 3. Retinex算法的Python实现4. 完结 1. 引言 图像增强是图像处理中的重要技术之一&#xff0c;它可以改善图像的亮度、对比度和颜色等…

微信开发者工具模拟器中不显示鼠标问题

前言 在使用微信开发者工具开发微信小程序时&#xff0c;使用到了第二屏幕&#xff0c;在第一屏幕上&#xff0c;微信开发者工具模拟器中&#xff0c;可以正常显示鼠标&#xff0c;而在第二屏幕上不显示鼠标。 解决方案&#xff1a; 方案1&#xff1a;设置指针轨迹&#xff…

【JMeter分布式压测连接Jenkins生成测试报告报错:Data exporter “html“ is unable to export data】

An error occurred: Data exporter “html” is unable to export data. Build step “Execute shell” marked build as failure 发生了一个错误:数据导出器“html”无法导出数据。 构建步骤“执行shell”将构建标记为失败 查看JMeter-master日志jmeter.log 发现是由于没有r…

基于springboot+vue的文物收藏系统(源代码+数据库+13000字论文)082

基于springbootvue的文物收藏系统(源代码数据库13000字论文)082 一、系统介绍 本项目前后端分离(本项目有ssmvue版本) 本系统分为管理员、用户两种角色 用户角色包含以下功能&#xff1a; 登录、文物查看、文物资料下载、文物收藏管理、文物维护管理、文物封存管理、个人中…

赛效:电子书可以转换成TXT吗

1&#xff1a;在“其他功能”菜单里点击“电子书转TXT”。 2&#xff1a;点击页面中间的号或者拖拽电子书上传。常规格式的电子书&#xff0c;都可以上传。 3&#xff1a;文件添加成功后&#xff0c;点击右下角的“开始转换”。 4&#xff1a;文件转换成功后&#xff0c;点击下…

Vue element admin git安装失败-2023年7月6日

Vue element admin-2023年7月6日 Vue element admin官网安装失败&#xff0c;是由于依赖包&#xff0c;所nodejs要求版本很低&#xff0c;导致和新版的18、16版本不兼容&#xff0c;git下安装失败。解决办法 Vue element admin官网 https://panjiachen.gitee.io/vue-element-a…

大数据的薪资怎么样?是真的很高么

既然提到了数据的问题&#xff0c;其实不妨看一下各大招聘平台在不同城市给出的薪资&#xff0c;百闻不如一见&#xff0c;自己真正看到了就知道能拿多少了。当然&#xff0c;是否能高薪&#xff0c;很大一部分还是取决于自身的能力的 猎聘大数据研究院发布了《2022未来人才就…

【yolov5】训练自己的数据集-实践笔记

【yolov5】训练自己的数据集-实践笔记 使用yolov5训练自己的数据集&#xff0c;以RSOD数据集为例&#xff0c;图像数量976&#xff0c;一共四类。 yolov5源码&#xff1a;https://github.com/ultralytics/yolov5 官网的代码会一直更新&#xff0c;相关依赖环境也会变&#xf…

嵌套和递归使用模板类

嵌套和递归使用模板类 模板栈模板数组栈中嵌套数组数组中嵌套栈数组中嵌套数组 模板栈 #pragma once #include <iostream> // 包含头文件。 using namespace std; // 指定缺省的命名空间。template<class DataType> class mystack2 { private:Data…

Java面向对象程序开发——文件与流

文章目录 前言File类IO字符流与字节流字符流字节流打印流缓冲流 前言 File类 是文件和目录路径名的抽象表示&#xff0c;主要用于文件和目录的创建、查找和删除等操作。 方法有三类&#xff1a;1获取、2判断、3创建或删除 public String getAbsolutePath() &#xff1a;返回…

ELK部署安装

目录 一、环境准备 1.准备三台服务器&#xff08;带图形化的linuxCentOS7&#xff0c;最小化缺少很多环境&#xff09; 2.修改主机名 3.关闭防火墙 4.elk-node1、elk-node2 用系统自带的java 5.上传软件包到node1和node2 二、部署elasticsearch 1、node1、node2操作 2.no…

《华尔街幽灵》的三大交易规则

规则1&#xff1a;只持有正确的仓位 如果你下单后经过一段时间&#xff0c;市场没有证明你的交易是正确的&#xff0c;那么应该立即平仓。交易者在每次建仓后&#xff0c;首先应关注保护本金&#xff0c;及早平掉不正确的仓位&#xff0c;而不是过多考虑盈利金额。 如何判断交…

生命在于学习——风险评估

风险评估的目录 一、网络安全风险评估概述1、概念2、意义3、步骤4、基本原则5、评估要素6、网络安全风险评估方法 二、网络安全风险评估方法三、网络安全风险评估方案1、确定评估范围和目标2、收集信息3、评估威胁和漏洞4、评估安全控制5、评估风险和制定建议6、报告和沟通 四、…

匿名苏丹的网络攻击仍在继续: 继微软之后拳头游戏成为最新目标

黑客组织 "匿名苏丹 "声称&#xff0c;它对美国视频游戏开发商和出版商Riot Games发起了分布式拒绝服务&#xff08;DDoS&#xff09;攻击。 据称匿名苏丹的目标是Riot Games的登录门户&#xff0c;该组织在Telegram帖子中宣布&#xff0c;这次攻击持续了30分钟至1小…

《随便测测》做UI测试

目录 前排提示 使用playwright录制ui操作 创建UI模板 运行用例 查看报告 再次编辑代码 再次查看报告 selenoid服务搭建 配置selenoid服务地址 总结 前排提示 1.使用playwright[selenoid]&#xff0c;可选的远程浏览器执行用例 2.没有采用 PageObjectModule&#xff0…

展示与处理复杂JSON数据——gradio库的JSON模块详解

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…