享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。
适用场景
- 如果一个系统中存在大量的相同或者相似的对象,由于这类对象的大量使用,会造成系统内存的耗费,可以使用享元模式来减少系统中对象的数量。
- 对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。
优点
- 享元模式的优点在于它能够极大的减少系统中对象的个数
- 享元模式由于使用了外部状态,外部状态相对独立,不会影响到内部状态,所以享元模式使得享元对象能够在不同的环境被共享
缺点
- 由于享元模式需要区分外部状态和内部状态,使得应用程序在某种程度上来说更加复杂化了
- 为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变长
UML结构图
]
源码
享元类的接口
public interface Flyweight {
public void operation(int id);
}
具体共享类
public class ConcreteFlyweight implements Flyweight {
@Override
public void operation(int id) {
System.out.println("具体Flyweight : " + id);
}
}
不需要共享的享元具体实现类
public class UnsharedConcreteFlyweight implements Flyweight {
@Override
public void operation(int id) {
System.out.println("不共享的具体Flyweight : " + id);
}
}
享元工厂,用来创建并管理Flyweight对象。
public class FlyweightFactory {
private HashMap<String, Flyweight> flyweights = new HashMap<String, Flyweight>();
public FlyweightFactory() {
flyweights.put("X", new ConcreteFlyweight());
flyweights.put("Y", new ConcreteFlyweight());
flyweights.put("Z", new ConcreteFlyweight());
}
public Flyweight getFlyweight(String key) {
return flyweights.get(key);
}
}
客户端调用
public class Client {
public static void main(String[] args) {
int id = 20;
FlyweightFactory flyweightFactory = new FlyweightFactory();
Flyweight fx = flyweightFactory.getFlyweight("X");
fx.operation(--id);
Flyweight fy = flyweightFactory.getFlyweight("Y");
fy.operation(--id);
Flyweight fz = flyweightFactory.getFlyweight("Z");
fz.operation(--id);
UnsharedConcreteFlyweight unsharedConcreteFlyweight = new UnsharedConcreteFlyweight();
unsharedConcreteFlyweight.operation(--id);
}
}
设计模式系列:
创建型 | 结构型 | 行为型 |
---|---|---|
工厂方法 简单工厂 抽象工厂 建造者模式 单例模式 原型模式 |
组合模式 外观模式 桥接模式 代理模式 享元模式 适配器模式 装饰模式 |
策略模式 模板方法 状态模式 观察者模式 备忘录模式 迭代器模式 命令模式 职责链模式 解释器模式 访问者模式 中介者模式 |