设计模式-结构型模式-享元设计模式
Posted 风流 少年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-结构型模式-享元设计模式相关的知识,希望对你有一定的参考价值。
一:定义
运用共享技术来有效的支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。
享元模式存在的两种状态:
- 内部状态: 即不会随着环境的改变而改变的可共享部分。
- 外部状态:指随环境改变而改变的不可以共享的部分。享元模式的实现要领就是区分应用的两种状态,并将外部状态外部化。
二:案例
俄罗斯方块。
/**
* 抽象享元角色
*/
public abstract class AbstractBox
// 获取图形
public abstract String getShape();
// 显示图形和颜色
public void display(String color)
System.out.println("方块形状:" + getShape() + ",颜色:" + color);
/**
* I图形:具体享元角色
*/
public class IBox extends AbstractBox
@Override
public String getShape()
return "I";
/**
* L图形:具体享元角色
*/
public class LBox extends AbstractBox
@Override
public String getShape()
return "L";
/**
* 单例工厂类:先把对象缓存起来,使用的时候从缓存中获取,减少对象的创建
*/
public class BoxFactory
private HashMap<String, AbstractBox> boxCache;
private static final BoxFactory factory = new BoxFactory();
private BoxFactory()
boxCache = new HashMap<>();
boxCache.put("I", new IBox());
boxCache.put("L", new LBox());
public static BoxFactory getInstance()
return factory;
public AbstractBox getShape(String name)
return boxCache.get(name);
public class Client
public static void main(String[] args)
BoxFactory boxFactory = BoxFactory.getInstance();
AbstractBox iBox = boxFactory.getShape("I");
iBox.display("绿色");
AbstractBox lBox = boxFactory.getShape("L");
lBox.display("灰色");
AbstractBox iBox2 = boxFactory.getShape("I");
iBox.display("灰色");
// true 同一个对象,重复利用
System.out.println(iBox == iBox2);
三:优缺点
优点:
- 极大减少内存中相似或者相同对象的数量,节约系统资源,提供系统性能;
- 享元模式中的外部状态相对独立,且不影响内部状态。
缺点:
- 为了使对象可以共享,需要将享元对象的部分状态外部化(以参数形式提供修改属性等),分离内部状态和外部状态,是程序逻辑复杂。
使用场景:
- 一个系统有大量相同或者相似对象,造成内存的大量消耗;
- 对象的大部分状态都可以外部化,可以将这些外部状态传入对象中;
- 在使用享元模式时需要委会一个存储享元对象的享元池,而这需要耗费一定的系统资源,因此应当在需要多次重复使用享元对象时才值得使用享元模式。
四:JDK源码中享元模式的使用
public static void main(String[] args)
Integer i1 = Integer.valueOf(127);
Integer i2 = Integer.valueOf(127);
// true
System.out.println(i1 == i2);
Integer i3 = Integer.valueOf(128);
Integer i4 = Integer.valueOf(128);
// false
System.out.println(i3==i4);
public final class Integer extends Number implements Comparable<Integer>
public static Integer valueOf(int i)
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
private static class IntegerCache
static final int low = -128;
static final int high;
static final Integer cache[];
static
// 初始化最大值
int h = 127;
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
// 循环往缓存中初始化,默认缓存 -128 到127之间的Integer对象,当调用Integer.valueOf()时
// 如果参数在-128到127之间就计算下标并从缓存中获取,否则 new Integer(num);
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
以上是关于设计模式-结构型模式-享元设计模式的主要内容,如果未能解决你的问题,请参考以下文章