03-JAVA设计模式-享元模式

news2024/11/16 16:33:51

享元模式

什么是享元模式

享元模式(Flyweight Pattern)是一种对象结构型设计模式,用于减少创建对象的数量,以减少内存占用和提高系统性能。它通过共享已经存在的对象来避免创建大量相似的对象,从而降低内存消耗。

在享元模式中,通常会有一些细粒度的对象,它们具有一些共同的属性,但是某些属性可能会变化。

  • 优点
    • 减少对象数量:通过共享对象,可以显著减少系统中对象的数量,从而节省内存空间。
    • 提高性能:由于减少了对象的创建和销毁,可以提高系统的性能。
  • 缺点
    • 增加系统复杂性:引入享元模式可能会增加系统的复杂性,特别是当处理内在状态和外在状态的分离时。
    • 可能不适用于所有场景:不是所有情况都适合使用享元模式,例如当对象的状态变化非常频繁时,共享对象可能不是最佳选择。

核心

  • 享元模式以共享的方式高效的支持大量细粒度对象的复用。
  • 享元对象能做到共享的关键是区分了内部状态和外部状态。
    • 内部状态:可以共享,不会岁环境变化发生改变
    • 外部状态:不可以共享,会随环境变化二改变

享元模式的实现

  • 抽象享元类(Flyweight):通常是一个接口或者抽象类,声明公共的方法,这些方法可以想外界提供对象的内部状态及设置外部状态
  • 具体享元类(ConcreteFlyweight):为内部状态提供成员变量进行存储
  • 非共享享元类(UnsharedConcreteFlyweight):不能为共享的子类可以设计成非共享享元类
  • 享元工厂(FlyweightFactory):创建并管理享元对象享元池一般设计成键值对

案例

对于围棋,棋子进行简单可以划分:
内部状态:颜色
外部状态:棋盘坐标

UML

在这里插入图片描述

实现步骤:

  1. 定义外部状态:地址Address

  2. 定义享元接口:提供操作外部状态的接口,通过传入地址获取外部状态地址的信息

  3. 定义享元接口的实现(围棋)

    • 通过属性设置内部状态,并提供内部状态的设置及调用方法(这里只提供了设置方法)
    • 通过实现享元接口,传入外部状态调用外部状态方法或获取外部状态属性
  4. 享元工厂

    • 定义享元池(通常以键值对形式缓存),用于缓存共享内部状态(该方法只适用单线程,多线程需要进行优化)
    • 提供获取内部状态的方法,如果享元池中已存在,则享元池中对象,否则新建一个对象并设置到享元池中

代码实现

Address.java

// 定义外部状态
public class Address {
    private int x;
    private int y;

    public Address(int x, int y) {
        this.x = x;
        this.y = y;
    }
    public int getX() {
        return x;
    }
    public int getY() {
        return y;
    }
}

Flyweight.java

// 享元接口:
// *  提供操作外部状态的接口
public interface Flyweight {
    // 获取棋子信息:
//     *  通过传入地址获取外部状态地址的信息
    void getInfo(Address address);
}

ChessPieces.java

//定义享元接口的实现:
// 围棋:
//  通过属性设置内部状态,并提供内部状态的设置及调用方法(这里只提供了设置方法)、
//  通过实现享元接口,传入外部状态调用外部状态方法或获取外部状态属性
public class ChessPieces implements Flyweight{
    private String color;

    public ChessPieces(String color) {
        this.color = color;
    }

    @Override
    public void getInfo(Address address) {
        System.out.printf("颜色:%s,坐标:x=%s,y=%s%n",color,address.getX(),address.getY());
    }
}

FlyweightFactory.java

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

// 享元工厂
// * 定义享元池(通常以键值对形式缓存),用于缓存共享内部状态(该方法只适用单线程,多线程需要进行优化)
// * 提供获取内部状态的方法,如果享元池中已存在,则享元池中对象,否则新建一个对象并设置到享元池中
public class FlyweightFactory {

    // 定义享元池
    private Map<String, Flyweight> mapPool = new HashMap<String, Flyweight>();

    // 提供获取内部状态的方法
    public Flyweight getChessPieces(String key){
        Flyweight flyweight = mapPool.get(key);
        if(flyweight == null){
            flyweight = new ChessPieces(key);
            mapPool.put(key, flyweight);
        }
        return flyweight;
    }
}

TestClient.java

public class TestClient {
    public static void main(String[] args) {
        FlyweightFactory flyweightFactory = new FlyweightFactory();
        Flyweight chessPieces = flyweightFactory.getChessPieces("白色");
        chessPieces.getInfo(new Address(1,2));
    }
}

执行结果:

在这里插入图片描述

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git

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

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

相关文章

vue3.0项目生成标签条形码(插件:jsbarcode)并打印(插件:Print.js)支持pda扫码枪扫描

文章目录 功能场景生成条形码设置打印功能踩坑 功能场景 功能场景&#xff1a;供应链中对一些货品根据赋码规则进行赋码&#xff0c;赋码之后生成根据赋码结果生成条形码&#xff0c;执行打印功能&#xff0c;贴在货品之上&#xff0c;打印之后可以用pda的手枪进行扫描&#x…

蓝桥杯2024年第十五届省赛真题-数字接龙

思路&#xff1a;DFS&#xff0c;因为输入的i&#xff0c;j的顺序导致&#xff0c;方向向量中x是行编号&#xff0c;y是列编号。方向向量可能和直觉上不同。 错的 //int dx[8]{0,1,1,1,0,-1,-1,-1}; //int dy[8]{1,1,0,-1,-1,-1,0,1}; 对的 int dx[]{-1,-1,0,1,1,1,0,-1}; int…

Hotcoin4月16日上新热门资产:头部RWA技术提供方Centrifuge(CFG)

Hotcoin持续为全球600万用户发掘优质潜力资产&#xff0c;热门币种交易上热币。一文快速了解今日上新资产:Centrifuge(CFG) 推荐指数 8.2 交易对 CFG/USDT 交易时间 4月16日 19:00 资产赛道 RWA 项目简介 Centrifuge是一个去中心化资产融资协议&#xff0c;专注于释放现实世界资…

计算机视觉——基于OpenCV和Python进行模板匹配

模板匹配&#xff1f; 模板匹配是它允许在一幅较大的图像中寻找是否存在一个较小的、预定义的模板图像。这项技术的应用非常广泛&#xff0c;包括但不限于图像识别、目标跟踪和场景理解等。 目标和原理 模板匹配的主要目标是在一幅大图像中定位一个或多个与模板图像相匹配的…

05.MySQL索引事务

1. 索引 1.1 概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。 可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各自的数据结构实现 1.2 作用 数据库中的表、数据、索引之间的关系&#xff0c;类似于书架上的…

链表创建的陷阱与细节

链表是线性表的一种&#xff0c;它在逻辑结构上是连续的&#xff0c;在物理结构上是非连续的。 也就是说链表在物理空间上是独立的&#xff0c;可能是东一块西一块的。如下顺序表和链表在内存空间上的对比&#xff1a; 而链表的每一块空间是如何产生联系实现在逻辑结构上是连续…

pycharm永久改变sys.path

进入pycharm&#xff0c;选择file->settings->interpreter 在这里选择图中所示show all 再单击左上角减号右侧第三个&#xff0c;长得像思维导图的图标 之后添加你的路径&#xff0c;确认即可

vim使用指南:指令、配置、插件、异常

文章目录 vi / vim命令模式插入模式光标定位复制粘贴删除撤销替换删除查找 底行模式保存退出行号查找多开其他 视图模式注释 异常vim配置vim插件 vi / vim vim的本质是一个编辑器&#xff0c;是一种多模式的编辑器&#xff0c;只能进行读写操作&#xff0c;不能进行编译编辑器…

jmeter-while控制器用法

condition中添加while结束循环的条件&#xff0c;以下语句的意思是&#xff0c;当percent等于100时&#xff0c;就跳出while循环继续执行 ${__javaScript("${percent}" ! 100)} 举例&#xff0c;以下方法是getPercent为一个引出的异步接口&#xff0c;该接口的返回包…

uni-admin中引入uni-cms的缺少schema及uni-media-library缺少云函数的问题

1. 在管理端运行提示一些表找不到&#xff0c;因为是uni-admin关联的uni-starter的服务空间&#xff0c;在uni-admin的uniCloud中没有内容&#xff0c;在uni-starter的uniCloud中也没有发现对应的表&#xff0c;后面干脆在云端找到对应的表之后新建了&#xff0c;然后再下载到本…

盲人导航功能特点:革新出行体验的实时避障应用深度解析

作为一名资深记者&#xff0c;我有幸亲历并详尽报道一款专为盲人群体设计的导航应用叫做蝙蝠避障&#xff0c;它不仅提供了精准的路线指引&#xff0c;更创新性地融入了实时避障功能。这款应用凭借其盲人导航功能特点&#xff0c;正以前所未有的方式提升盲人的出行自由度与安全…

https证书是什么,怎么申请

https证书的名称有很多&#xff0c;其本名是SSL/TLS数字证书&#xff0c;本意是实现https访问的证书&#xff0c;故而很多人会称之为https证书&#xff0c;又因为其需要部署于域名服务器之上&#xff0c;所以也有人称之为域名证书。 所以https证书又名SSL证书、域名证书等。 h…

【Web】Dest0g3 520迎新赛 题解(全)

目录 phpdest EasyPHP SimpleRCE funny_upload EasySSTI middle PharPOP ezip NodeSoEasy Really Easy SQL&easysql EzSerial ljctr phpdest 尝试打pearcmd&#xff0c;但似乎没有写文件的权限 ?config-create/&file/usr/local/lib/php/pearcmd.php&a…

FreeRTOS_day3

1.总结任务调度算法之间的区别&#xff0c;重新实现一遍任务调度算法的代码。 抢占式调度&#xff1a;高优先级的任务可以打断低优先级的任务执行 时间片轮转&#xff1a;相同优先级的任务有相同的时间片&#xff08;1ms&#xff09;&#xff0c;时间片耗尽任务会强制退出 协…

2024 抖音欢笑中国年(五):Wasm、WebGL 在互动技术中的创新应用

前言 随着 Web 前端技术的不断发展&#xff0c;越来越多的新兴技术方案被引入到 Web 开发中&#xff0c;其中 Wasm 和 WebGL 作为前端领域的两大利器&#xff0c;为开发者带来了更多的可能性。 本文将结合2024 年抖音欢笑中国年的部分项目&#xff0c;重点介绍如何利用 Wasm 和…

前端三剑客 HTML+CSS+JavaScript ② HTML相关概念

他们这样形容我 是暴雨浇不灭的火 —— 24.4.18 学习目标 理解 HTML的概念 HTML的分类 HTML的关系 HTML的语义化 应用 HTML骨架格式 sublime基本使用 一、HTML初识 HTML指的是超文本标记语言&#xff0c;是用来描述网页的一种语言 HTML不是一种编程语言&#xff0c;而是一种标记…

C语言开发的医学影像数字化PACS系统源码 带三维重建和还原的PACS源码

C语言开发的医学影像数字化PACS系统源码 带三维重建和还原的PACS源码 PACS全称Picture Archivingand Communication Systems。它是应用在医院影像科室的系统&#xff0c;主要的任务就是把日常产生的各种医学影像&#xff08;包括核磁&#xff0c;CT&#xff0c;超声&#xf…

CSS基础+基本选择器和复合选择器(如果想知道CSS的基础+基本选择器和复合选择器知识点,那么只看这一篇就足够了!)

前言&#xff1a;在我们学习完了html之后&#xff0c;我们就要开始学习三大件中的第二件—CSS&#xff0c;CSS 可以控制多重网页的样式和布局&#xff0c;也就是将我们写好的html代码加上一层华丽的衣裳&#xff0c;使网页变得更加精美。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨…

halcon瓶身表面缺陷检测-滤波差值法

前言 在瓶子&#xff0c;灌装产业中&#xff0c;通常需要瓶子的瓶身进行检测&#xff0c;防止其出现划痕&#xff0c;破洞等情况。但是通常瓶身出现的缺陷都非常小&#xff0c;往往只是一些细小的划痕&#xff0c;这种情况就非常容易被误判为OK情况。 所以采用滤波差值法&…

Stability AI 发布 SD3 API:开启人工智能新篇章

文章目录 1.Stable Diffusion 3 API开放了! 2.Stability AI Document地址3.获取API Key4.API方式调用SD3出图接口地址接口请求规范接口请求响应结果 5.Stable Diffusion 3.0、Stable Image Core、Fooocus 2.3.1、MidJounery效果查看 1.Stable Diffusion 3 API开放了! Stabilit…