My logo
Published on

flyweight 代理模式

一个享元模式的常见使用场景,其实就是jvm内缓存实现,如果我们不想引入ehcache之类缓存框架,就想简单一点,通过自己实现的一个map来缓存对应的一些数据,比如说每个权限的数据,或者每个员工的数据,在内存里自己维护一个缓存工厂,就是基于享元模式的思想来实现的。

场景

  1. 我们现在要缓存一些数据,比如说权限,根据权限的ID作为key,权限数据自己本身是value
  2. 但是我们不需要使用太复杂的ehcache框架之类的去使用,特别特别的简单的
  3. 我们就想基于自己的Map去实现一套东西
package wang.jinggo.basics.zhss.flyweight;

import java.util.HashMap;
import java.util.Map;

/**
 * @author: wangyj
 * @create: 2021-10-24
 * @version: 1.0.0
 **/
public class FlyweightPatternDemo {

    public static void main(String[] args) {
        Flyweight flyweight1 = FlyweightFactory.get("对象1");
        flyweight1.execute();

        Flyweight flyweight2 = FlyweightFactory.get("对象1");
        flyweight2.execute();

        System.out.println(flyweight1 == flyweight2);

        // 享元
        // 享受,元数据
        // 同一个数据,我就认为是一个元数据,整个系统里这个数据就一份,缓存起来
        // 整个系统对这个数据,全部享受他一个对象实例即可

        // 直接既有内存来缓存一块数据,用享元模式
    }

    public static interface Flyweight {

        void execute();
        String getName();
        void setName(String name);

    }

    public static class ConcreteFlyweight implements Flyweight {

        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public ConcreteFlyweight(String name) {
            super();
            this.name = name;
        }

        public void execute() {
            System.out.println(name + "执行功能逻辑");
        }

    }

    public static class FlyweightFactory {

        private static Map<String, Flyweight> cachePool = new HashMap<String, Flyweight>();

        public static Flyweight get(String name) {
            Flyweight flyweight = cachePool.get(name);
            if(flyweight == null) {
                flyweight = new ConcreteFlyweight(name);
                cachePool.put(name, flyweight);
            }
            return flyweight;
        }

    }

}