享元模式
- 描述
- 基本組件
- 使用
描述
當內存中存在大量類似的對象時,可以考慮使用享元模式減少整體內存占用。
可以將相同的部分和不同的部分進行拆分,以達到多個對象共享相同部分內存的目的。
基本組件
通常享元對象通過共享的屬性映射一個享元對象。
- 公共對象
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);}
}