一.享元模式的简介
享元模式(FlyWeight Pattern)运用共享技术有效地支持大量细粒度的对象,该模式属于结构型模式。
享元模式的核心思路:通过重用现有对象,减少对象数量的方式,优化应用所需的对象结构的方式
二.享元模式的设计类图
(图片加载慢,多刷新几下,耐心等待……)
注:享元工厂类(FlyWeightFactory)和享元抽象类(FlyWeight),二者是聚合关系。
聚合关系:享元工厂类(FlyWeightFactory)包含享元抽象类(FlyWeight),但享元抽象类(FlyWeight)不是享元工厂类(FlyWeightFactory)的一部分。
三.享元模式的代码及讲解
1.抽象享元类(FlyWeight)
设计分析: 抽象享元类
所有具体享元类的父类,提供一个可以接收并作用于外部的状态。
/**
* 享元类的父类
*/
abstract class FlyWeight {
// 抽象的操作方法
public abstract void operation(int state);
}
2.具体享元实现类(ConcreteFlyWeight)
设计分析: 具体的享元类,继承FlyWeight并实现接口,并为内部空间增加存储状态。
class ConcreteFlyWeight extends FlyWeight {
@Override
public void operation(int state) {
System.out.println("具体的FlyWeight对象:" + state);
}
}
3.不需要共享FlyWeight子类(UnSharedConcreteFlyWeight)
设计分析: 有些对象不需要共享,则可在此实现。
class UnSharedConcreteFlyWeight extends FlyWeight {
@Override
public void operation(int state) {
System.out.println("不需要共享的具体的FlyWeight对象:" + state);
}
}
4.享元工厂类(FlyWeightFactory)
设计分析: 用来创建并管理FlyWeight对象,确保合理的共享FlyWeight,FlyWeightFactory为用户提供一个自己已经创建好的享元对象。
class FlyWeightFactory {
// 需要用HashMap存储这些对象
private HashMap<String, FlyWeight> flyWeights = new HashMap<String, FlyWeight>();
/**
* 享元工厂构造器 :在初始化工厂的时候,将具体享元对象创建好
*/
public FlyWeightFactory() {
super();
flyWeights.put("A", new ConcreteFlyWeight());
flyWeights.put("B", new ConcreteFlyWeight());
flyWeights.put("C", new ConcreteFlyWeight());
}
// 根据key获取享元对象
public FlyWeight getFlyWeight(String key) {
return flyWeights.get(key);
}
}
5.客户端(Client)中用法:
设计分析:在客户端中,通过享元工厂创建享元对象,通过普通方式创建不需要共享的对象 。
代码如下:
public class Client {
public static void main(String[] args) {
int state = 20;
FlyWeightFactory factory = new FlyWeightFactory();
FlyWeight flyWeightA = factory.getFlyWeight("A");
flyWeightA.operation(state--);
FlyWeight flyWeightB = factory.getFlyWeight("B");
flyWeightB.operation(state--);
FlyWeight flyWeightC = factory.getFlyWeight("C");
flyWeightC.operation(state--);
UnSharedConcreteFlyWeight unSharedFlyWeight = new UnSharedConcreteFlyWeight();
unSharedFlyWeight.operation(state--);
}
}
6.运行结果
结果分析: 享元对象的创建后,并作用于外部对象。
具体的FlyWeight对象:20
具体的FlyWeight对象:19
具体的FlyWeight对象:18
不需要共享的具体的FlyWeight对象:17
7.源码下载
本文示例代码下载地址:点击下载
三.总结:
当程序中有大量对象时,有可能会造成内存溢出,可以把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,从而避免重新创建,浪费内存空间。基于这种理念,享元模式应运而生。
享元模式减少创建对象的数量,以减少内存占用和提高性能。
1.享元模式的优点
- 减少对象的创建,降低系统的运行内存,提高了内存的使用效率。
2.享元模式的缺点
- 提高了系统的复杂度,需要分离出外部状态和内部状态,否则强行共享,可能会引起线程安全问题。