首页 > 其他分享 >设计模式-享元模式

设计模式-享元模式

时间:2024-03-03 23:34:27浏览次数:19  
标签:享元 缓存 flyweight 模式 这个 然后 Flyweight 设计模式

享元模式的英文是flyweight,就是flyweight模式,那这个模式,它适合是什么样的场景,其实很简单, 就是我们现在要缓存些数据,比如说我们要缓存这个权限,然后根据这个权限的id,作为key,然后权限数据,自己本身,是这个value,但是,我们不需要使用这个太复杂的,比如说ehcache框架之类的,去使用,因为这个东西,它本身是特别的这个简单的啊,那么我们可能就想基于自己的这个Map,然后去实现一套东西,然后,那我们应该怎么来做,其实就是享元模式啊。 

这个享元模式的话呢,它大概是一个什么思路,我给大家看一看,去实现这样的一个,对象池的这么一个缓存吧,FlyweightPatternDemo,它有一个public static class Flyweight {},或者先给它一个接口吧,public static interface Flyweight{},然后void execute();,然后我们这边是public static class ConcreteFlyweight implements Flyweight{},重写接口中的execute的方法,输出一句话,System.out.println(name + "执行功能逻辑");, 然后给它一个name属性,private String name;,添加get、set方法,和一个有参的构造方法。

然后我们这边再给一个public static class FlyweightFactory{},这个里面我们是这样的,private Map<String, Flyweight> cachePool = new HashMap<String, Flyweight>();,可以叫做一个缓存池, 好,然后下面的话呢,这块就是public void put(Flyweight flyweight){},然后,cachePool.put(flyweight.getName(), flyweight);,这个应该这样的,不要put,直接get就行了,public Flyweight get(String name){},Flyweight flyweight = cachePool.get(name);,Flyweight接口中增加String getName();,如果说flyweight,它是null的话,然后我们就给它那个,Flyweight flyweight = new Flyweight();,flyweight.setName(name),在Flyweight接口中增加void setName(String name);,这样的, 我们就直接改put,cachePool.put(name, flyweight);,然后return一个flyweight,

哎,大家看一下,其实这个东西,它就是所谓的享元模式啊,  我一会给大家解释,它为什么是享元模式,然后,我们这边可以来看一下,就是Flyweight flyweight = FlyweightFactory.get("对象1");,我们甚至可以弄成这个静态的, 然后,flyweight.execute();,就这样一个思路,这样一执行,对象1执行功能逻辑。

为什么,这个是什么意思啊,就是大家看一下,我们如果要去获取个对象,就从这个FlyweightFactory里面去获取, 然后这个里面会判断出,如果这个对象的标识,从cachePool里面拿,如果没拿到的话,那么就给它创建下,放到cachePool这个缓存里面去, 再放到这个缓存池里面去,再把这个对象给返回回来,下次你再去获取它的时候, 你看一下,把main方法中的,Flyweight flyweight1 = FlyweightFactory.get("对象1");,flyweight1.execute();,Flyweight flyweight2 = FlyweightFactory.get("对象1");,flyweight2.execute();,然后输出System.out.println(flyweight1 == flyweight2);,你看它们俩是不是一个对象,执行为true对吧, 没有问题啊,你看你下次又去获取这个对象1的时候,它拿到的其实,就直接会从缓存cachePool里面去拿了, 当然这里,要结合,我之前给大家讲的线程的安全的一些东西,保证它的一个线程安全性。

好,但是的话呢,它的核心思想,其实是什么呢,就什么叫做享元啊,你看享就是享受的意思,元就是元数据的意思,然后,就它的意思就是说是,同一份,同一个数据,我就认为是一个元数据,然后整个系统里,这个数据,就一份,然后缓存起来,然后整个系统对这个数据,全部享受它一个对象实例即可,这个就叫做享元,就享元不知道的话,你说起来,就享元是什么意思啊,然后其实就是说,相同的那个数据,就比如说,对象1就代表了一个数据,相同的数据,它的这个内存里面,只有一个实例,然后整个系统后面要用它的时候,拿到的全是一个实例,这就叫做享元,就享受元数据,其实就是这么的一个意思啊。

ok,那么这个东西,常用的场景,其实,我其实很少用,但其实场景,其实就是,直接基于内存来那个缓存一块数据,那么这个时候可以用,享元模式,然后我们在这个电商系统里面,会给大家去说,我们比如说像像这个权限吧,比如说,对于这个权限的话,我们可以就是,因为这个权限它属于什么,就是,写少读多,因为可能所有的操作,都要去校验这个权限,那么对于权限,这样的数据的话,权限还有员工吧,像这样的数据,就可以在咱们的内存里面,去给它缓存一份,但是因为这个数据它量很少,所以说,也不需要基于什么redis啊,包括一个比较复杂的这种ehcache这种缓存框架去做,直接就我们自己实现一个,基于享元模式,实现一套这个对象缓存池子,然后把,比如说权限,跟员工这种频繁读,但是很少写的数据给它缓存起来,就ok了啊,好,那么其实就是这样的一个思路吧。

 

 

 

 

 

 

end

标签:享元,缓存,flyweight,模式,这个,然后,Flyweight,设计模式
From: https://www.cnblogs.com/HarryVan/p/18050990

相关文章

  • 利用单例模式与阻塞队列实现异步的日志系统,记录服务器运行状态
    目录类结构概述主要特性总结Log类是一个用于日志记录的C++类,其设计具有以下特点和功能:类结构概述类成员变量:path_:日志文件存储路径。suffix_:日志文件后缀名。MAX_LINES_:每个日志文件允许的最大行数。lineCount_:当前日志文件已写的行数。toDay_:当前日志文......
  • MySQL之SQL语句+严格模式
    SQL使用规范在数据库管理系统中,SQL语句关键字不区分大小写(但建议用大写),参数区分大小写。建议命令大写,数据库名、数据表名、字段名统一小写,如数据库名、数据表名、字段名与关键字同名,使用反引号圈起来,避免冲突。SQL语句可单行或多行书写,默认以英文分号(;)结尾,关键词不能跨多......
  • 对于需要实时处理的代码语句 就用定时器中断模式,实现多线程模式,建议不要用查询模式。
    对于需要实时处理的代码语句就用定时器中断模式,实现多线程模式,建议不要用查询模式。 示例代码1:查看代码#include"delay.h"#include"sysInt.h"#include"intrins.h"charSMGDuan[]={0x5B,0x3F,0x5B,0x66, 0x40,0x40, 0x3F,0x3F}; //2024--MMcharsegDuan[]={0x3F,0......
  • Hyper-v系列---【使用NAT模式连接虚拟机并使用宿主机网络】
    1.虚拟交换机外部网络:就是桥接模式,虚拟机ip和宿主机ip在一个段上,网关和宿主机一样。弊端是,一切换网络,虚拟机ip就得跟着改。内部网络(推荐):就是NAT模式,可以固定ip,把所有虚拟机改成同一个网关ip,使用以太网把网络共享给NAT模式的网卡,把NAT模式的虚拟网卡ip地址改成前面虚拟机的网......
  • kmp模式匹配例题思考
    题目描述读入一个字符串数组string[],再读入一个短字符串。要求查找string[]中和短字符串的所有匹配,输出行号和匹配的字符串以。匹配时不区分大小写,并且可以有一个中括号表示的模式匹配。例如,对aa[123]bb来说,aa1bb,aa2bb,aa3bb都算匹配。输入格式:第一行输入字符串数组的长度接下......
  • 跟着GPT学设计模式之代理模式
    引言代理模式(ProxyDesignPattern)在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。代理模式的关键角色包括:抽象主题(Subject):定义了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。目标对象(RealSubject):也......
  • 关于KMP模式匹配的一些思考
    算法简介模式匹配给定主串text和模式串pattern,在主串中查找,如果找到了模式串,返回模式串在主串中的起始位置,从1开始计数。暴力求解求解模式匹配算法的核心思想是:蛮力法。即使用两个指针i和j,其中i指针用来遍历text,j指针用来遍历pattern。当text[i]==text[j]的时候,继续比较;如果不......
  • 文件扩展模式
    当然,我可以帮你将这些Python代码转化为Markdown格式的笔记。以下是你的Markdown笔记:Python中的文件操作的扩展模式在Python中,文件操作的模式主要有读模式(r)、写模式(w)、追加模式(a),以及它们的扩展模式(r+,w+,a+)。1.读写模式(r+)读写模式允许你先读取文件,然后再写入文件。......
  • 策略模式代码示例(二)
    一、定义策略模式,针对每一个不同的类型,调用具有共同接口的不同实现类,从而使得它们可以相互替换。策略模式,针对实现同一接口的不同的类,采用不同的策略。比如,面对高级会员、初级会员会采用不同的折扣。策略模式,可以避免大量的if和else。二、角色策略模式涉及到三个角色:●......
  • 观察者模式
    察者模式是一种设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象的状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。在Java中,观察者模式可以使用java.util包中的Observer和Observable来实现。具体步骤如下:定义主题对......