享元模式是一种比较简单的模式,其实就是一个有缓存的工厂。享元模式旨在减少重复对象的创建和销毁,减少内存使用,一般需要使用池的概念的时候就需要使用享元模式,比如常量池,线程池等。
package flyWeight;
public interface ICrayon {
void draw(String name);
}
package flyWeight;
public class Crayon implements ICrayon{
private String color;
public Crayon(String color) {
super();
this.color = color;
System.out.println(String.format("创建%s蜡笔",color));
}
@Override
public void draw(String name) {
System.out.println(String.format("用%s的蜡笔画%s",color,name));
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
package flyWeight;
import java.util.HashMap;
import java.util.Map;
public class CrayonFactory {
private static Map<String,ICrayon> map=new HashMap<>();
public static ICrayon obtainCrayon(String color) {
if(map.containsKey(color)) {
return map.get(color);
}
ICrayon crayon=new Crayon(color);
map.put(color, crayon);
return crayon;
}
}
package flyWeight;
public class Client {
public static void main(String[] args) {
ICrayon blueCrayon1=CrayonFactory.obtainCrayon("蓝色");
blueCrayon1.draw("天空");
ICrayon greenCrayon=CrayonFactory.obtainCrayon("绿色");
greenCrayon.draw("草地");
ICrayon blueCrayon2=CrayonFactory.obtainCrayon("蓝色");
blueCrayon2.draw("海水");
}
}
打印结果:
创建蓝色蜡笔
用蓝色的蜡笔画天空
创建绿色蜡笔
用绿色的蜡笔画草地
用蓝色的蜡笔画海水
小结:
1.享元模式注意点:
使用享元模式需要区分内部状态和外部状态。内部状态是固定相对固定,外部状态是相对多变的,二者互不相关。享元模式就是基于这个相对固定的内部条件添加缓存的。在这个demo中,内部状态是颜色,外部状态是要画的东西。