前言
本文主要内容
正文
介绍
Use sharing to support large numbers of fine-grained objects efficiently.(使用共享对象可有效地支持大量的细粒度的对象。 ) 设计模式之禅第2版
我的理解是,若一个类(假设命名为”A”)有多个在实际使用(实例化的对象中)中变化少的属性,可以将这些属性抽取出来,单独作为一个类,这个类就称为共享类好了,然后将这个共享类的实例化对象缓存起来,当需要的属性值相同时,从缓存中获取这个共享类的对象。以此来缩小A所占用的空间
通用类图及通用代码
从上面的介绍中,可以知道,这个设计模式需要需要三个角色:共享,缓存,被优化
类图
代码
被优化
package cn.zjm404.stu.design.flyweight;public class Flyweight {//非共享属性private String a1;private int a2;//共享属性private final SharedObject SHARED_OBJECT;public Flyweight(String _a1,int _a2,SharedObject _SHARED_OBJECT){this.a1 = _a1;this.a2 = _a2;this.SHARED_OBJECT = _SHARED_OBJECT;}public void method(){//业务逻辑}}
共享
package cn.zjm404.stu.design.flyweight;import lombok.AllArgsConstructor;import lombok.Getter;import lombok.Setter;import java.util.Objects;@Getter@Setter@AllArgsConstructorpublic class SharedObject {//共享的属性private String a1;private String a2;@Overridepublic boolean equals(Object o) {if (this == o) {return true;}if (o == null || getClass() != o.getClass()) {return false;}SharedObject that = (SharedObject) o;return Objects.equals(a1, that.a1) &&Objects.equals(a2, that.a2);}@Overridepublic int hashCode() {return Objects.hash(a1, a2);}}
缓存
package cn.zjm404.stu.design.flyweight;import java.util.ArrayList;public class FlyweightFactory {/*** 缓存*/private static final ArrayList<SharedObject> cache = new ArrayList<>();/**** @param param1 共享的* @param param2 共享的* @param param3 非共享的* @param param4 非共享的* @return*/public static Flyweight getFlyweight(String param1,String param2,String param3,int param4){SharedObject sharedObject = new SharedObject(param1,param2);for (SharedObject object : cache) {if(sharedObject.equals(object) == true){sharedObject = object;}else {cache.add(sharedObject);}}return new Flyweight(param3,param4,sharedObject);}}
使用
package cn.zjm404.stu.design.flyweight;public class Client {public static void main(String[] args) {Flyweight flyweight;}}
享元模式应用举例
将使用频繁且变化较少的属性共享,以便减少类的大小。想到这点,第一反应就是包装器类。拿Integer举例。也许开发者认为Integer的-128~127是常用值,于是对这些值进行了缓存(具体可以看源码,这个high可以通过配置文件修改,但是不可以超过Integer.MAX_VALUE - (-low) -1)
然后,在使用时,若在缓存范围内,返回缓存值
