前言:
享元设计模式也叫轻量级模式,是把对象不变化的部分抽取出来形成一个对象,避免这个对象修改。享元的目的是为了减少不必要的内存消耗,通过共享技术,有效的实现了大量细粒度对象的复用。
内部状态:存储在享元对象内部,一般在构造对象时设置,不会随环境变化而改变,因此内部状态可以复用。
外部状态:随环境改变而改变,是不可以共享的状态,所以外部状态需要在使用时由客户端传入(会造成线程安全问题)
怎么实现:
抽象享元类:
具体享元类:
享元类工厂:控制实例的创建和共享
代码:
享元接口:
package com.xhx.designpattern;
/**
* xuhaixing
* 2018/6/21 23:04
* 享元接口
**/
public interface FlyWeight {
void doing(String externalState);
}
享元具体类:
package com.xhx.designpattern;
/**
* xuhaixing
* 2018/6/21 23:05
* 享元具体类
**/
public class ConcreateFlyWeight implements FlyWeight{
//内部状态
private String name;
public ConcreateFlyWeight(String name){
this.name=name;
}
//外部状态 externalState
public void doing(String externalState) {
System.out.println("name="+name+" exterState="+externalState);
}
}
享元工厂:负责创建和维护享元实例,放在map中,key为内部状态
package com.xhx.designpattern;
import java.util.concurrent.ConcurrentHashMap;
/**
* xuhaixing
* 2018/6/21 23:09
**/
public class FlyWeightFactory {
private static ConcurrentHashMap<String, FlyWeight> flyWeights = new ConcurrentHashMap<String, FlyWeight>();
/**
* 通过内部状态name保存对象,如果外部状态改变,会导致线程不安全问题
* @param name
* @return
*/
public static FlyWeight getFlyWeight(String name){
if(flyWeights.get(name)==null){
synchronized (flyWeights){
if(flyWeights.get(name)==null){
FlyWeight flyWeight = new ConcreateFlyWeight(name);
flyWeights.put(name,flyWeight);
}
}
}
return flyWeights.get("name");
}
}
java中的字符串就保存在String的常量池中
我的git代码地址