设计模式(10):享元模式

一.核心:

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

二.场景:

  • 内存属于稀缺资源,不要随便浪费。如果有很多个相同或相似的对象,我们可以通过享元模式,节省内存。

三.角色组成

  • 抽象享元角色(FlyWeight): 享元对象抽象基类或者接口,同时定义出对象的外部状态和内部状态的接口或实现;
  • 具体享元角色(ConcreteFlyWeight): 抽象享元类的实现
  • 享元工厂(FlyWeightFactory): 维护一个享元对象的池,内部一般使用Map存储已经创建的享元对象

四.开发中应用的场景:

  • 享元模式由于其共享的特性,可以在任何"池"中操作,比如:线程池、数据库连接池
  • String类的设计也是享元模式
  • Integer的值在-128~127内也是享元模式

五.优缺点:

  • 优点:
    • 极大减少内存中对象的数量;
    • 相同或相似对象内存中只存一份,极大的节约资源,提高系统性能;
    • 外部状态相对独立,不影响内部状态。
  • 缺点:
    • 模式较复杂,使程序逻辑复杂化;
    • 为了节省内存,共享了内部状态,分离出外部状态,而读取外部状态使运行时间变长。用时间换取了空间。

六.以围棋为例代码实现

  • 1.举例:

    • 我们知道每个围棋棋子都是一个对象,有这些属性:颜色、形状、大小和位置,其中颜色、形状、大小都是一样的,只有位置不一样。这些相同的属性可以共享,我们称它为内部状态;而位置每个棋子都不一样,不能共享,我们称它为外部状态。
  • 2.代码实现

    • (1)抽象享元类
/*** 抽象享元类*/
public interface ChessFlyWeight {void  setColor(String c); //设置颜色String  getColor(); //获得颜色void display(Doordinate c);//显示位置
}
    • (2)具体享元类
/*** 具体享元类*/
class ConcreteChess implements ChessFlyWeight{//颜色 共享private String color;public ConcreteChess(String color) {this.color = color;}@Overridepublic void setColor(String color) {this.color=color;}@Overridepublic String getColor() {return color;}@Overridepublic void display(Doordinate c) {System.out.println("棋子的颜色:"+color+"\t"+"当前棋子的位置:"+c.getX()+"-->"+c.getY());}
}
    • (3)外部状态
/*** 外部状态(棋子位置类)UnSharedConcreteFlyWeight*/
public class Doordinate {private int x,y;public Doordinate() {}public Doordinate(int x, int y) {this.x = x;this.y = y;}public int getX() {return x;}public int getY() {return y;}public void setX(int x) {this.x = x;}public void setY(int y) {this.y = y;}
}
    • (4)享元工厂
/*** 享元工厂*/
public class ChessFlyWeightFactory{private static Map<String ,ChessFlyWeight> map=new HashMap();public static ChessFlyWeight getChess(String color){if(map.get(color)!=null){return map.get(color);}else{ChessFlyWeight cfw=new ConcreteChess(color);map.put(color, cfw);return cfw;}		}	
}
    • (4)调用
/*** 享元模式*/
public class App {public static void main(String[] args) {ChessFlyWeight chess1=ChessFlyWeightFactory.getChess("黑色");ChessFlyWeight chess2=ChessFlyWeightFactory.getChess("黑色");System.out.println(chess1==chess2);System.out.println("增加外部状态的处理");		chess1.display(new Doordinate(10,10));chess2.display(new Doordinate(20,20));System.out.println(chess1==chess2);}
}



更多设计模式学习:

          设计模式(1):介绍
          设计模式(2):单例模式
          设计模式(3):工厂模式
          设计模式(4):建造者模式
          设计模式(5):原型模式
          设计模式(6):桥接模式
          设计模式(7):装饰器模式
          设计模式(8):组合模式
          设计模式(9):外观模式
          设计模式持续更新中…

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

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

相关文章

第1章.提示词:开启AI智慧之门的钥匙

什么是提示词&#xff1f; 提示词&#xff0c;是引导语言模型的指令&#xff0c;让用户能够驾驭模型的输出&#xff0c;确保生成的文本符合需求。 ChatGPT&#xff0c;这位文字界的艺术大师&#xff0c;以transformer架构为基石&#xff0c;能轻松驾驭海量数据&#xff0c;编织…

嵌入式第一部分-第一集:ARM那些你得知道的事

ARM&#xff1a;Advanced RISC Machine&#xff0c;先进精简指令集机器 ARM公司只做设计&#xff0c;不生产。 国内IC生产厂商&#xff1a;华为海思、全志、瑞芯微、MTK&#xff08;联发科&#xff09; 扩展&#xff1a;ARM的商业模式了解。 使用三星S5PV210开发板进行视频的讲…

大数据 - Hadoop系列《五》- HDFS文件块大小及小文件问题

系列文章&#xff1a; 大数据- Hadoop入门-CSDN博客 大数据 - Hadoop系列《二》- Hadoop组成-CSDN博客 大数据 - Hadoop系列《三》- HDFS&#xff08;分布式文件系统&#xff09;概述_大量小文件的存储使用什么分布式文件系统-CSDN博客 大数据 - Hadoop系列《三》- MapRedu…

LeetCode算法——数组/字符串篇

对刷过的算法进行总结&#xff0c;所用解法都是最符合我个人逻辑的&#xff0c;以后再刷的话就看这篇帖子了 # 代码随想录——数组理论基础 首先要知道数组在内存中的存储方式&#xff0c;这样才能真正理解数组相关的面试题 数组是存放在连续内存空间上的相同类型数据的集合 …

IntelliJ IDEA 2023 for Mac 好用的Java开发工具

IntelliJ IDEA 2023是一款由JetBrains开发的强大的集成开发环境&#xff08;IDE&#xff09;软件&#xff0c;适用于多个编程语言。它旨在提高开发人员的生产力和代码质量&#xff0c;具有以下多种特色功能&#xff1a; 软件下载&#xff1a;IntelliJ IDEA 2023 v2023.3.6中文激…

2d导入人物素材进行分割后设置图层

1、设置分辨率大小 2、相机调整大小&#xff0c;要符合场景 3、选择2D sprite 编辑器 或者 点击这个也行 4、分割图像 5、设置过滤模式 6、图层设置

CAJViewer8.1下载地址及安装教程

CAJViewer是中国学术期刊&#xff08;CAJ&#xff09;全文数据库的专用阅读软件。CAJViewer是中国知识资源总库&#xff08;CNKI&#xff09;开发的一款软件&#xff0c;旨在方便用户在线阅读和下载CAJ数据库中的学术论文、期刊和会议论文等文献资源。 CAJViewer具有直观的界面…

vue render 函数详解 (配参数详解)

vue render 函数详解 (配参数详解) 在 Vue 3 中&#xff0c;render 函数被用来代替 Vue 2 中的模板语法。 它接收一个 h 函数&#xff08;或者是 createElement 函数的别名&#xff09;&#xff0c;并且返回一个虚拟 DOM。 render 函数的语法结构如下&#xff1a; render(h) …

Modbus协议介绍

Modbus存储区 从机存储数据&#xff0c;那么肯定要有一个存储区&#xff0c;那就需要文件操作&#xff0c;我们都知道这文件可以分为只读(-r)和读写(-wr)两种类型 并且存储的数据类型可以分为 &#xff1a;布尔量 和 16位寄存器 布尔量比如IO口的电平高低&#xff0c;灯的开关…

如何实现对节点尺寸动态变化的有效监测与检测

前言 近来有需求要做分页&#xff0c;听起来可能有点Low。 所以我要把Low的事情做得有点逼格。 分页本身没啥&#xff0c;但是数据量起来了&#xff0c;比如十万。 要是不做点处理&#xff0c; 那你的页面估计爽得很&#xff0c;机器也爽得很。 放心&#xff0c;我不会让你这么…

金仓方案 | 全国高速联网收费系统国产化升级进行时

近年来&#xff0c;国家提出了交通强国建设战略&#xff0c;鼓励在交通领域加强自主创新&#xff0c;推动产业转型升级。高速公路收费系统作为高速公路行业的核心&#xff0c;也是交通领域信息技术应用创新的重中之重&#xff0c;自主可控问题成为系统建设和运营的关键难点。 2…

[机器学习]练习闵可斯基距离

闵可斯基距离&#xff08;Minkowski distance&#xff09;是一种用于衡量向量空间中两点之间距离的方法。它是曼哈顿距离和欧几里得距离的一般化形式。闵可斯基距离使用一个参数 p 来调整计算方法&#xff0c;其中 p 是一个大于 0 的实数值。 在二维空间中&#xff0c;闵可斯基…

可控占比闪烁电路

1启动Q0.0 亮一秒歇一秒循环执行 定时器设置为2秒 使用指令LD> T0 k10 控制亮和灭时间

[已解决]Unable to find a valid cUDNN algorithm to run convolution

问题描述&#xff1a;Unable to find a valid cUDNN algorithm to run convolution 可能原因&#xff1a; 1、cuDNN库的配置问题。 2、未指定训练使用的显卡或显卡占用率已满。 3、确定性算法。 解决方案&#xff1a;&#xff08;从下往上试&#xff09; 1、更新GPU驱动、cuD…

大数据面试英文自我介绍参考(万字长文)

发现有一个怪圈,如果码农年龄35+,除非非常匹配,不然在国内企业筛选可能就筛选不过。国外码农可以干到40+、50+。一些外企,对年龄35+的码农依然青睐。这些外企对英文是有要求,通常是要英文自我介绍,下面提供一些英文自我介绍参考。 参考1: Good morning/afternoon, I a…

mysql 用户管理-权限管理

学习了用户管理&#xff0c;再学习下权限管理。 3&#xff0c;权限管理 权限管理主要是对登录到MySQL的用户进行权限验证。所有用户的权限都存储在MySQL的权限表中&#xff0c;不合理的权限规划会给MySQL服务器带来安全隐患。数据库管理员要对所有用户的权限进行合理规…

腾讯2024实习生在线笔试-0331

Q1 小红的图上染色 小红拿到了一个无向图&#xff0c;其中一些边被染成了红色。 小红定义一个点是“好点”&#xff0c;当且仅当这个点的所有邻边都是红边。 现在请你求出这个无向图“好点”的数量。 注&#xff1a;如果一个节点没有任何邻边&#xff0c;那么它也是好点。 …

2、Cocos Creator 下载安装

Cocos Creator 从 v2.3.2 开始接入了全新的 Dashboard 系统&#xff0c;能够同时对多版本引擎和项目进行统一升级和管理&#xff01;Cocos Dashboard 将做为 Creator 各引擎统一的下载器和启动入口&#xff0c;方便升级和管理多个版本的 Creator。还集成了统一的项目管理及创建…

【MySQL】内外连接——内连接、外连接、左外连接、右外连接、内外连接的区别、左外连接和右外连接的区别

文章目录 MySQLMySQL表的内连接和外连接1. 内连接2. 外连接2.1 左外连接2.2 右外连接 3. 内外连接的区别4. 左外连接和右外连接的区别 MySQL MySQL表的内连接和外连接 MySQL 中的内连接&#xff08;INNER JOIN&#xff09;和外连接&#xff08;包括左外连接 LEFT JOIN 和右外连…

Java研学-SpringBoot(五)

七 统一异常处理 1 框架自带方式 Spring Boot 默认会把所有错误都交给 BasicErrorController 类完成处理&#xff0c;错误的视图导向到 classpath:/static/error/ 和 classpath:/templates/error/路径上&#xff0c;HTTP 状态码就是默认视图的名称。如&#xff1a; // 出现 4…