设计模式简述(十八)享元模式
享元模式
- 描述
- 基本组件
- 使用
描述
当内存中存在大量类似的对象时,可以考虑使用享元模式减少整体内存占用。
可以将相同的部分和不同的部分进行拆分,以达到多个对象共享相同部分内存的目的。
基本组件
通常享元对象通过共享的属性映射一个享元对象。
- 公共对象
public final class CommonData {private String province;private String city;private String county;public CommonData(String province, String city, String county) {this.province = province;this.city = city;this.county = county;}public CommonData() {}public synchronized void setData(String province, String city, String county) {this.province = province;this.city = city;this.county = county;}public String getProvince() {return province;}public String getCity() {return city;}public String getCounty() {return county;}@Overridepublic String toString() {return "CommonData{" +"province='" + province + '\'' +", city='" + city + '\'' +", county='" + county + '\'' +'}';}
}
- 抽象享元对象(定义通用逻辑,持有公共对象)
public abstract class AbstractFlyWeight {private final CommonData commonData;private String name;protected AbstractFlyWeight(CommonData commonData) {this.commonData = commonData;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getProvince() {return commonData.getProvince();}public String getCity() {return commonData.getCity();}public String getCounty() {return commonData.getCounty();}public abstract void method();@Overridepublic String toString() {return "AbstractFlyWeight{" +"commonData=" + commonData +", name='" + name + '\'' +'}';}
}
- 具体享元对象
public class FlyWeight extends AbstractFlyWeight {protected FlyWeight(CommonData commonData) {super(commonData);}@Overridepublic void method() {System.out.println("FlyWeight method ...");}
}
- 享元对象工厂
public class FlyWeightFactory {private static final Map<String, CommonData> map = new ConcurrentHashMap<>();public static CommonData getFlyWeight(String key) {return map.computeIfAbsent(key, s -> {String[] split = s.split("-");assert split.length == 3;return new CommonData(split[0], split[1], split[2]);});}
}
使用
创建多个对象共用相同key的公共对象
public class Sample {public static void main(String[] args) {String key = "重庆市-渝北区-渝北区";CommonData commonData = FlyWeightFactory.getFlyWeight(key);AbstractFlyWeight flyWeight = new FlyWeight(commonData);flyWeight.setName("张三");flyWeight.method();System.out.println(flyWeight);AbstractFlyWeight flyWeight1 = new FlyWeight(commonData);flyWeight1.setName("李四");flyWeight1.method();System.out.println(flyWeight1);}
}