享元模式
概念
定义:
运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。
案例
【例】俄罗斯方块
下面的图片是众所周知的俄罗斯方块中的一个个方块,如果在俄罗斯方块这个游戏中,每个不同的方块都是一个实例对象,这些对象就要占用很多的内存空间,下面利用享元模式进行实现。
抽象方块类
public abstract class AbstractBox {
public abstract String getShape();
public void display(String color) {
System.out.println("方块形状:" + this.getShape() + " 颜色:" + color);
}
}
Ibox类
public class IBox extends AbstractBox{
@Override
public String getShape() {
return "I";
}
}
Lbox类
public class LBox extends AbstractBox{
@Override
public String getShape() {
return "L";
}
}
Obox类
public class OBox extends AbstractBox{
@Override
public String getShape() {
return "O";
}
}
方块工厂类
public class BoxFactory {
private static Map<String, AbstractBox> map ;
private BoxFactory() {
map = new HashMap<String, AbstractBox>();
AbstractBox iBox = new IBox();
AbstractBox lBox = new LBox();
AbstractBox oBox = new OBox();
map.put("I", iBox);
map.put("L", lBox);
map.put("O", oBox);
}
public static BoxFactory getInstance() {
return SingletonHolder.instance;
}
private static class SingletonHolder {
private static final BoxFactory instance = new BoxFactory();
}
public AbstractBox getBox(String key) {
return map.get(key);
}
}
测试方法
public class Test {
public static void main(String[] args) {
BoxFactory boxFactory = BoxFactory.getInstance();
AbstractBox iBox = boxFactory.getBox("I");
AbstractBox oBox = boxFactory.getBox("O");
AbstractBox lBox = boxFactory.getBox("L");
AbstractBox lBox1 = boxFactory.getBox("L");
iBox.display("红色");
oBox.display("灰色");
lBox.display("黑色");
lBox1.display("绿色");
System.out.println(lBox == lBox1);
}
}
使用场景
- 一个系统有大量相同或者相似的对象,造成内存的大量耗费。
- 对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。
- 在使用享元模式时需要维护一个存储享元对象的享元池,而这需要耗费一定的系统资源,因此,应当在需要多次重复使用享元对象时才值得使用享元模式。