【设计模式】Java设计模式 - 享元模式
Java设计模式 - 享元模式
不断学习才是王道
继续踏上学习之路,学之分享笔记
总有一天我也能像各位大佬一样
原创作品,更多关注我CSDN: 一个有梦有戏的人
准备将博客园、CSDN一起记录分享自己的学习心得!!!
分享学习心得,欢迎指正,大家一起学习成长!

简介
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
                                                                                                                                                    ———— 菜鸟联盟
UML图:

主要角色
1.抽象享元角色(Flyweight)
享元对象抽象基类或者接口,同时定义出对象的外部状态和内部状态的接口或实现。
2.具体享元角色(ConcreteFlyweight)
实现抽象角色定义的业务。该角色的内部状态处理应该与环境无关,不能出现会有一个操作改变内部状态,同时修改了外部状态。
3.不可同享角色(UnConcreteFlyweight)
一般不会出现在享元工厂中
4.享元工厂(FlyweightFactory)
负责管理享元对象池和创建享元对象,提供容器池,同时提供获取对象方法。
内部状态和外部状态
- 享元模式提供了两个要求:细粒度和共享对象。
- 外部状态:对象得以依赖的一个标记,是随着环境的变换而变化,不可共享的状态。
- 内部状态:对象共享出来的信息,存在享元对象内部且不会随着环境的变化而变化。
实例
本次采用图书馆借书的案例来理解享元模式,形式很简单,首先定义一个抽象类,里面有个抽象方法,接着定义子类来继承抽象类,并实现其方法。为了模拟外部状态,还需定义一个用户实体类。构建工厂来作为池存放对象,并暴露获取对象的方法。最后通过调用方法。
类图:

①、抽象类的定义
只有一个借书的方法
package com.lyd.demo.flyweight;
import com.lyd.demo.entity.User;
/**
 * @Author: lyd
 * @Description: 图书馆 - 抽象类
 * @Date: 2022-09-01
 */
public abstract class Library {
    public abstract void borrow(User user); // 抽象方法 - 借书
}
②、抽象类的子类
实现抽象方法
package com.lyd.demo.flyweight;
import com.lyd.demo.entity.User;
/**
 * @Author: lyd
 * @Description: 具体子类
 * @Date: 2022-09-01
 */
public class LibraryImpl extends Library {
    private String name; // 书名 - 内部状态
    public LibraryImpl(String name) {
        this.name = name;
    }
    @Override
    public void borrow(User user) {
        System.out.println("图书馆的书《" + name + "》已被[" + user.getName() + "]借出");
    }
}
③、外部状态 - User实体类
package com.lyd.demo.entity;
/**
 * @Author: lyd
 * @Description: 实体 - user - 模拟 外部状态
 * @Date: 2022-09-01
 */
public class User {
    private String name;
    public User(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
④、工厂类
用Map集合来充当缓冲池,存放对象,并且提供获取对象的方法,为了方便观察享元模式的作用,还有个获取对象池中对象数量。
package com.lyd.demo.factory;
import com.lyd.demo.flyweight.Library;
import com.lyd.demo.flyweight.LibraryImpl;
import java.util.HashMap;
/**
 * @Author: lyd
 * @Description: 工厂类
 * @Date: 2022-09-01
 */
public class LibraryFactory {
    // 用集合来充当缓存池,暂存书籍
    private HashMap<String, LibraryImpl> pool = new HashMap<String, LibraryImpl>();
    // 如果有书籍就放入缓存
    public Library getLibraryImpl(String name) {
        if (!pool.containsKey(name)) {
            // 创建一个放入
            pool.put(name, new LibraryImpl(name));
        }
        return pool.get(name);
    }
    // 获取书籍个数
    public int bookCount() {
        return pool.size();
    }
}
⑤、测试
通过工厂类调用获得对象,再去调用借书方法,采用两种不用角色和不同数据来演绎享元模式的案例实现。
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() + " 本");
    }
}
运行结果:

好文推荐
- 设计模式 | 享元模式及典型应用 掘金 https://juejin.cn/post/6844903683860217864
- 结构型设计模式之享元模式 51CTO https://blog.51cto.com/chencoding/5592357
- 享元模式 简书 https://www.jianshu.com/p/a2aa75939766
- 09【享元设计模式】 CSDN https://blog.csdn.net/Bb15070047748/article/details/126367998
创作不易,可能有些语言不是很通畅,如有错误请指正,感谢观看!记得一键三连哦!
【设计模式】Java设计模式 - 享元模式的更多相关文章
- Java设计模式之《享元模式》及应用场景
		原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6542449.html 享元模式:"享"就是分享之意,指一物被众人共享, ... 
- Java设计模式学习记录-享元模式
		前言 享元模式也是一种结构型模式,这篇是介绍结构型模式的最后一篇了(因为代理模式很早之前就已经写过了).享元模式采用一个共享来避免大量拥有相同内容对象的开销.这种开销最常见.最直观的就是内存损耗. 享 ... 
- 重学 Java 设计模式:实战享元模式「基于Redis秒杀,提供活动与库存信息查询场景」
		作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 程序员的上下文是什么? 很多时候一大部分编程开发的人员都只是关注于功能的实现,只 ... 
- 【转】Java设计模式之《享元模式》及应用场景
		享元模式:“享”就是分享之意,指一物被众人共享,而这也正是该模式的终旨所在. 享元模式有点类似于单例模式,都是只生成一个对象来被共享使用.这里有个问题,那就是对共享对象的修改,为了避免出现这种情况,我 ... 
- java设计模式-----10、享元模式
		Flyweight模式也叫享元模式,是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用.它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于只是因重复而导致使 ... 
- Java描述设计模式(18):享元模式
		本文源码:GitHub·点这里 || GitEE·点这里 一.使用场景 应用代码 public class C01_InScene { public static void main(String[] ... 
- 《JAVA设计模式》之享元模式(Flyweight)
		在阎宏博士的<JAVA与模式>一书中开头是这样描述享元(Flyweight)模式的: Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是 ... 
- Java设计模式:Flyweight(享元)模式
		概念定义 享元(Flyweight)模式运用共享技术高效地支持大量细粒度对象的复用. 当系统中存在大量相似或相同的对象时,有可能会造成内存溢出等问题.享元模式尝试重用现有的同类对象,如果未找到匹配的对 ... 
- 设计模式学习心得<享元模式 Flyweight>
		享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝 ... 
- 设计模式(11)--Flyweight(享元模式)--结构型
		作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. 2.模式特点: 享元模 ... 
随机推荐
- jfinal中如何使用过滤器监控Druid监听SQL执行?
			摘要:最开始我想做的是通过拦截器拦截SQL执行,但是经过测试发现,过滤器至少可以监听每一个SQL的执行与返回结果.因此,将这一次探索过程记录下来. 本文分享自华为云社区<jfinal中使用过滤器 ... 
- Java中时间方法大全01(持续更新)
			下面这些方法都可以封装到一个工具类中 /** * 获取当前时间的时间戳 */ public static int getCurrentTimeIntValue() { return (int) (Sy ... 
- Linux系列之查找命令
			前言 Linux 有四个常用的查找命令:locate.whereis.which 和 find.本文介绍它们的区别和简单用法. locate命令 这个命令将检查你的整个文件系统,并找到该关键词的每一次 ... 
- Java开发学习(十)----基于注解开发定义bean   已完成
			一.环境准备 先来准备下环境: 创建一个Maven项目 pom.xml添加Spring的依赖 <dependencies> <dependency> < ... 
- C++系统函数
			C++语言预先编写了很多常用函数提供给广大程序员使用,这些函数被统称为系统函数.C++语言全盘继承了C语言的标准C库,另外又增加了一些新的库(更多的是系统类库),这些新库被统称为C++标准库. 一.C ... 
- C++几种特殊形式的函数
			本篇文章主要介绍C++语言中5中特殊形式的函数,分别是带默认形参值的函数.重载函数.内联函数.带形参和返回值的主函数以及递归函数. 一.带默认形参值的函数 如果函数的形参在多数情况下都可以取某个固定的 ... 
- ORM框架介绍——什么是ORM框架?
			1.什么是ORM?对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.ORM框架是连接数据库的桥梁,只要提供 ... 
- 基础算法学习以及$STL$的使用
			1.优先队列 (1)大根堆(小顶堆) priority_queue<int,vector<int>,greater<int> >q; (2)小根堆(大顶堆) pri ... 
- 简单易用的任务队列-beanstalkd
			概述 beanstalkd 是一个简单快速的分布式工作队列系统,协议基于 ASCII 编码运行在 TCP 上.其最初设计的目的是通过后台异步执行耗时任务的方式降低高容量 Web 应用的页面延时.其具有 ... 
- Python词频分析
			Python词频分析 一.前言 在日常工作或者生活中,有时候会遇到词频分析的场景.如果是要进行词频分析,那么首先需要对句子进行分词,将句子中的单词进行切割并按照词性进行归类. 在Python中有个第三 ... 
