前言

本文主要内容

  • 介绍享元模式
  • 介绍享元模式的通用类图及通用代码
  • 介绍享元模式在Integer中的应用

    环境

  • openjdk 14

正文

介绍

Use sharing to support large numbers of fine-grained objects efficiently.(使用共享对象可有效地支持大量的细粒度的对象。 ) 设计模式之禅第2版

我的理解是,若一个类(假设命名为”A”)有多个在实际使用(实例化的对象中)中变化少的属性,可以将这些属性抽取出来,单独作为一个类,这个类就称为共享类好了,然后将这个共享类的实例化对象缓存起来,当需要的属性值相同时,从缓存中获取这个共享类的对象。以此来缩小A所占用的空间

通用类图及通用代码

从上面的介绍中,可以知道,这个设计模式需要需要三个角色:共享,缓存,被优化

类图

享元模式 - 图1

代码

被优化

  1. package cn.zjm404.stu.design.flyweight;
  2. public class Flyweight {
  3. //非共享属性
  4. private String a1;
  5. private int a2;
  6. //共享属性
  7. private final SharedObject SHARED_OBJECT;
  8. public Flyweight(String _a1,int _a2,SharedObject _SHARED_OBJECT){
  9. this.a1 = _a1;
  10. this.a2 = _a2;
  11. this.SHARED_OBJECT = _SHARED_OBJECT;
  12. }
  13. public void method(){
  14. //业务逻辑
  15. }
  16. }

共享

  1. package cn.zjm404.stu.design.flyweight;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Getter;
  4. import lombok.Setter;
  5. import java.util.Objects;
  6. @Getter
  7. @Setter
  8. @AllArgsConstructor
  9. public class SharedObject {
  10. //共享的属性
  11. private String a1;
  12. private String a2;
  13. @Override
  14. public boolean equals(Object o) {
  15. if (this == o) {
  16. return true;
  17. }
  18. if (o == null || getClass() != o.getClass()) {
  19. return false;
  20. }
  21. SharedObject that = (SharedObject) o;
  22. return Objects.equals(a1, that.a1) &&
  23. Objects.equals(a2, that.a2);
  24. }
  25. @Override
  26. public int hashCode() {
  27. return Objects.hash(a1, a2);
  28. }
  29. }

缓存

  1. package cn.zjm404.stu.design.flyweight;
  2. import java.util.ArrayList;
  3. public class FlyweightFactory {
  4. /**
  5. * 缓存
  6. */
  7. private static final ArrayList<SharedObject> cache = new ArrayList<>();
  8. /**
  9. *
  10. * @param param1 共享的
  11. * @param param2 共享的
  12. * @param param3 非共享的
  13. * @param param4 非共享的
  14. * @return
  15. */
  16. public static Flyweight getFlyweight(String param1,String param2,String param3,int param4){
  17. SharedObject sharedObject = new SharedObject(param1,param2);
  18. for (SharedObject object : cache) {
  19. if(sharedObject.equals(object) == true){
  20. sharedObject = object;
  21. }else {
  22. cache.add(sharedObject);
  23. }
  24. }
  25. return new Flyweight(param3,param4,sharedObject);
  26. }
  27. }

使用

  1. package cn.zjm404.stu.design.flyweight;
  2. public class Client {
  3. public static void main(String[] args) {
  4. Flyweight flyweight;
  5. }
  6. }

享元模式应用举例

将使用频繁且变化较少的属性共享,以便减少类的大小。想到这点,第一反应就是包装器类。拿Integer举例。也许开发者认为Integer的-128~127是常用值,于是对这些值进行了缓存(具体可以看源码,这个high可以通过配置文件修改,但是不可以超过Integer.MAX_VALUE - (-low) -1)
image.png
然后,在使用时,若在缓存范围内,返回缓存值
image.png

参考