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

享元模式

什么是享元模式

享元模式(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;}@Overridepublic 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.rhkb.cn/news/306270.html

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

相关文章

韦东山freeRTOS第一天课程笔记

文章目录 一、课程目标二、堆和栈三、创建freertos任务 一、课程目标 双架构 ARM&#xff1a; 目前主流的架构&#xff0c;用得最广&#xff0c;芯片公司需要付费购买&#xff0c;再搭配各种模块才能设计出芯片。 RISC-V&#xff1a; 后起之秀&#xff0c;开源、免费。 双系统…

【考研数学】《660》+《880》高分搭配方法

&#x1f4dd;《660题》和《880题》高效刷题方法 1️⃣做题要有针对性&#xff0c;不要为了做题而做题 &#x1f4aa;660和880题虽然多&#xff0c;但是你不用全都做完&#xff0c;你可以把它当成是题源&#xff0c;里面的每一道题都很经典&#xff0c;如果搞懂一道&#xff…

练习6 beach beauty

文章目录 图片展示 图片展示

第十三章 OpenGL ES-RGB、HSV、HSL模型介绍

第十三章 OpenGL ES-RGB、HSV、HSL模型详细介绍 第一章 OpenGL ES 基础-屏幕、纹理、顶点坐标 第二章 OpenGL ES 基础-GLSL语法简单总结 第三章 OpenGL ES 基础-GLSL渲染纹理 第四章 OpenGL ES 基础-位移、缩放、旋转原理 第五章 OpenGL ES 基础-透视投影矩阵与正交投影矩阵…

Java基础第十课——类与对象(1)

前面二白的九讲属于Java基础方面的内容&#xff0c;总体来说偏基础和简单&#xff0c;能完成的操作也有限&#xff0c;有兴趣的同学可以写一写相关的管理系统&#xff0c;后面二白也会上传一些自己敲的小系统&#xff0c;下面就要开始Java面对对象的知识内容了&#xff0c;从这…

特别详细的Spring Cloud 系列教程2:微服务网关gateway的启动

继上一篇&#xff1a;特别详细的Spring Cloud 系列教程1&#xff1a;服务注册中心Eureka的启动 在比较多的教程和书籍里&#xff0c;spring cloud的微服务网关用的Zuul。然而&#xff0c;zuul已经不被官方提倡&#xff0c;现在提倡用的是spring cloud gateway。因为gateway的整…

MySQL相关问题快问快答

我写这篇文章的目的只有一个&#xff1a;通过这些问题来帮助我去将我脑子里的MySQL脑图给巩固熟悉&#xff0c;通过回答这些问题&#xff0c;让我对脑子里的MySQL知识有更深的印象&#xff0c;当什么时候我的MySQL脑图不熟的时候&#xff0c;我就可以拿这篇文章来去巩固一下&am…

数字化智慧养老:引领老年人融入科技时代新生活

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 人类社会已经步入了一个全新的数字时代。在这个时代&#xff0c;互联网、大数据、人工智…

【Linux进阶之路】地址篇

文章目录 一、ipv4地址1. 基本概念2. 分类3.CIDR4.特殊的ip地址 二、IP协议1. 协议字段2.分片与重组3.路由 三、NAT技术1.公有和私有2.NAT3.NAPT 四、ARP协议1.MAC地址2.ARP 五、DHCP协议六、DNS协议尾序 一、ipv4地址 1. 基本概念 概念&#xff1a;IP地址&#xff0c;英文全…

FHE全同态加密简介

1. 何为FHE&#xff1f; FHE (Fully homomorphic encryption)&#xff1a; 是一种隐私技术&#xff0c;支持直接对密文进行计算&#xff0c;而无需对密文先解密再计算。即&#xff0c;任何第三方或云厂商&#xff0c;都可对敏感信息的密文进行处理&#xff0c;而无需访问密文内…

爬虫现在还有那么吃香嘛?

Python 作为一种广泛应用的编程语言&#xff0c;在 Web 开发、大数据开发、人工智能开发和嵌入式开发等领域都有着重要的应用。 Python 的易学性、清晰性和可移植性等特点使它得到很多技术人士的喜爱。对于数据科学和机器学习领域的程序员来说&#xff0c;Python 提供了强大的…

华为ensp中PPPOE (点对点协议)原理和配置命令

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月12日6点30分 PPPoE&#xff08;PPP over Ethernet&#xff09;是一种将PPP协议封装到以太网帧中的链路层协议。它可以使以太网网络中的多台主机连接到远端的宽带接…

打破传统,蔚莱普康定义国货美妆新未来

在全球美妆市场经济改革的今天&#xff0c;中国新兴品牌蔚莱普康&#xff0c;正在以前所未有的速度和规模&#xff0c;冲破瓶颈&#xff0c;赢得市场的广泛认可。这一切&#xff0c;得益于国家政策的扶持和国货品牌自身的不懈努力与创新。 各类国潮产品不断‘出圈’的背后&…

c语言:操作符

操作符 一.算术操作符: + - * % / 1.除了%操作符之外,其他的几个操作符可以作用与整数和浮点数,如:5%2.0//error. 2.对于操作符,如果两个操作数都为整数,执行整数除法而只要有浮点数执行的就是浮点数除法。 3.%操作符的两个操作数必须为整数。 二.移位操作符:<&…

数据结构复习指导之顺序表上基本操作的实现(插入、删除、查找)

文章目录 顺序表基本操作实现 知识总览 1.顺序表的初始化 1.1静态分配顺序表的初始化 1.2动态分配顺序表的初始化 2.插入操作 2.1插入操作流程 2.2插入操作时间复杂度 3.删除操作 3.1删除操作流程 3.2删除操作时间复杂度 4.查找操作 4.1按位查找 4.2按位查找时间…

【学习】Spring IoCDI

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 Spring 是什么&#xff1f; 什么是 IoC容器&#xff1f; 传统开发模式 loC开发模式 IoC的优势 IoC 的使用 Bean的…

飞书在成都举办先进生产力峰会,新希望、万华投资等企业参加

4月12日&#xff0c;飞书在成都举办“共谋新质、与先进齐飞”先进生产力峰会&#xff0c;该会由川商总会支持举办。峰会上&#xff0c;飞书邀请多名川渝明星企业一号位、管理者探讨“如何让区域经济走向全国经济”&#xff0c;探索千行百业的高质量发展道路。 会上&#xff0c…

视频号小店新商机逐渐爆发,高门槛仍挡不住商家前进的脚步!

大家好&#xff0c;我是电商花花。 不知道大家有没有发现一件很有意思的事情&#xff0c;就是现在有越来越多的商家涌入抖音小店&#xff0c;部分商家还是想在视频号小店里博一丝机会。 我们都知道视频号小店是除了抖音小店之外&#xff0c;最火热的项目了&#xff0c;部分商…

面对DDOS攻击,有哪些解决办法

随着互联网带宽的持续增长以及DDOS黑客技术的发展&#xff0c;DDOS拒绝服务攻击的实施变得愈发容易。商业竞争、打击报复、网络敲诈等多种因素&#xff0c;各行各业的用户都曾受到DDOS攻击的威胁。 一旦遭受到DDOS攻击&#xff0c;随之而来的就是业务宕机&#xff0c;用户无法…

【JS】获取接口返回 EventStream 结构的数据(即接收读取 stream 流)

文章目录 EventStream 是一种服务器推送的数据格式&#xff0c;可以用于实时数据传输。 接口返回的示例图 获取示例&#xff1a; // 这里的 url 为虚拟的&#xff0c;仅供演示用 fetch(https://test.cn.com/api/agent/2, {method: POST,headers: {Content-Type: applicatio…