享元模式的英文是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了啊,好,那么其实就是这样的一个思路吧。