

【设计模式】Java设计模式 - 享元模式 - 怒放吧德德
source link: https://www.cnblogs.com/lyd-code/p/16699528.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Java设计模式 - 享元模式
😄 不断学习才是王道
🔥 继续踏上学习之路,学之分享笔记
👊 总有一天我也能像各位大佬一样
🏆原创作品,更多关注我CSDN: 一个有梦有戏的人
👊准备将博客园、CSDN一起记录分享自己的学习心得!!!
🌝分享学习心得,欢迎指正,大家一起学习成长!
简介
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
———— 菜鸟联盟
UML图:
1|0主要角色
1.抽象享元角色(Flyweight)
享元对象抽象基类或者接口,同时定义出对象的外部状态和内部状态的接口或实现。
2.具体享元角色(ConcreteFlyweight)
实现抽象角色定义的业务。该角色的内部状态处理应该与环境无关,不能出现会有一个操作改变内部状态,同时修改了外部状态。
3.不可同享角色(UnConcreteFlyweight)
一般不会出现在享元工厂中
4.享元工厂(FlyweightFactory)
负责管理享元对象池和创建享元对象,提供容器池,同时提供获取对象方法。
1|0内部状态和外部状态
- 享元模式提供了两个要求:细粒度和共享对象。
- 外部状态:对象得以依赖的一个标记,是随着环境的变换而变化,不可共享的状态。
- 内部状态:对象共享出来的信息,存在享元对象内部且不会随着环境的变化而变化。
实例
本次采用图书馆借书的案例来理解享元模式,形式很简单,首先定义一个抽象类,里面有个抽象方法,接着定义子类来继承抽象类,并实现其方法。为了模拟外部状态,还需定义一个用户实体类。构建工厂来作为池存放对象,并暴露获取对象的方法。最后通过调用方法。
类图:
1|0①、抽象类的定义
只有一个借书的方法
1|0②、抽象类的子类
实现抽象方法
1|0③、外部状态 - User实体类
1|0④、工厂类
用Map集合来充当缓冲池,存放对象,并且提供获取对象的方法,为了方便观察享元模式的作用,还有个获取对象池中对象数量。
1|0⑤、测试
通过工厂类调用获得对象,再去调用借书方法,采用两种不用角色和不同数据来演绎享元模式的案例实现。
package com.lyd.demo.test;
import com.lyd.demo.entity.User; import com.lyd.demo.factory.LibraryFactory; import com.lyd.demo.flyweight.Library;
/** * @Author: lyd * @Description: 测试类 * @Date: 2022-09-01 */ public class FlyWeightTest { public static void main(String[] args) { // 创建工厂 LibraryFactory libraryFactory = new LibraryFactory(); Library book = libraryFactory.getLibraryImpl("Java设计模式"); book.borrow(new User("怒放吧德德"));
// 假设书已经归还
Library book2 = libraryFactory.getLibraryImpl("Java设计模式"); book2.borrow(new User("愤怒吧德德"));
Library book3 = libraryFactory.getLibraryImpl("Go语言编程"); book3.borrow(new User("怒放吧德德"));
System.out.println("现在有书:" + libraryFactory.bookCount() + " 本"); } }
好文推荐
👍创作不易,可能有些语言不是很通畅,如有错误请指正,感谢观看!记得一键三连哦!👍
__EOF__
Recommend
-
7
【设计模式】Java设计模式 -工厂模式 😄 不断学习才是王道 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 一个有梦有戏的人 @怒放吧德德 🌝分享学习...
-
11
Java设计模式 - 组合模式 😄 不断学习才是王道 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆原创作品,更多关注我CSDN:
-
5
Java设计模式 - 外观模式 😄 不断学习才是王道 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆原创作品,更多关注我CSDN:
-
6
SpringCloud - Nacos初体验 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 一个...
-
7
微服务 - 配置中心 - Nacos 🏆 一个有梦有戏的人 @怒放吧德德
-
4
服务调用 - OpenFeign 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 一个有...
-
7
SpringData - JPA 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 一个有梦有戏的...
-
7
Java8新特性 - Lambda表达式 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆
-
4
使用Grafana+Loki+Promtail入门级部署分布式日志系统(windows环境) 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬...
-
6
简单模拟Spring 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 一个有梦有戏的人
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK