flyweight模式

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

1.享元模式

  1. package com.example.demo.pattern.flyweight;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. /**
  5. * @author chenchao
  6. * @date 2021/11/9
  7. */
  8. public class FlyweightPatternDemo {
  9. public static void main(String[] args) {
  10. Flyweight flyweight1 = FlyweightFactory.get("对象1");
  11. flyweight1.execute();
  12. Flyweight flyweight2 = FlyweightFactory.get("对象1");
  13. flyweight2.execute();
  14. System.out.println(flyweight1 == flyweight2);
  15. // 享元
  16. // 享受,元数据
  17. // 同一个数据,我就认为是一个元数据,整个系统里这个数据就一份,缓存起来
  18. // 整个系统对这个数据,全部享受他一个对象实例即可
  19. // 直接既有内存来缓存一块数据,用享元模式
  20. }
  21. public static interface Flyweight {
  22. void execute();
  23. String getName();
  24. void setName(String name);
  25. }
  26. public static class ConcreteFlyweight implements Flyweight {
  27. private String name;
  28. public String getName() {
  29. return name;
  30. }
  31. public void setName(String name) {
  32. this.name = name;
  33. }
  34. public ConcreteFlyweight(String name) {
  35. super();
  36. this.name = name;
  37. }
  38. public void execute() {
  39. System.out.println(name + "执行功能逻辑");
  40. }
  41. }
  42. public static class FlyweightFactory {
  43. private static Map<String, Flyweight> cachePool = new HashMap<String, Flyweight>();
  44. public static Flyweight get(String name) {
  45. Flyweight flyweight = cachePool.get(name);
  46. if(flyweight == null) {
  47. flyweight = new ConcreteFlyweight(name);
  48. cachePool.put(name, flyweight);
  49. }
  50. return flyweight;
  51. }
  52. }
  53. }

2.说明

享元模式,从最基本的角度来说,其实就是维护固定数量的对象实例,不同的对象实例,只有一个,然后保存在内部的一个map中。可以算是跟单例模式的一个扩展和结合吧。

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