享元模式
介绍
享元模式(Flyweight Pattern),Flyweight是“轻量级”的意思,指的是拳击比赛中选手体重最轻的等级。顾名思义,该设计模式的作用是为了让对象变“轻”。一言以蔽之,就是“通过尽量共享实例来避免new出实例”。享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。
实现
在享元模式中有以下登场角色。
- Flyweight(轻量级)
按照通常方式编写程序会导致程序变重,所以如果能够共享实例会比较好,而Flyweight角色表示的就是那些实例会被共享的类。 - FlyweightFactory(轻量级工厂)
FlyweightFactory角色是生成Flyweight角色的工厂。在工厂中生成Flyweight角色可以实现共享实例。 - Client(请求者)
Client角色使用FlyweightFactory角色来生成Flyweight角色。
享元模式的通用类图如下:
享元模式代码实现如下:
- Flyweight类
public class Flyweight {
private String type;
public Flyweight(String type) {
this.type = type;
System.out.println("Flyweight type : " + this.type + " created;");
}
public void method() {
System.out.println("Flyweight type : " + this.type + " do something...");
}
} - FlyweightFactory类
public class FlyweightFactory {
private static Map<String, Flyweight> map = new ConcurrentHashMap<String, Flyweight>();
public static Flyweight getFlyweight(String type) {
Flyweight flyweight = map.get(type);
if (null == flyweight) {
flyweight = new Flyweight(type);
map.put(type, flyweight);
}
return flyweight;
}
} - Client类
public class Client {
public static void main(String[] args) {
Random random = new Random();
for (int i = 0; i < 5; i++) {
int type = random.nextInt(4);
Flyweight flyweight = FlyweightFactory.getFlyweight(String.valueOf(type));
flyweight.method();
}
}
} - 输出结果
Flyweight type : 3 created;
Flyweight type : 3 do something...
Flyweight type : 1 created;
Flyweight type : 1 do something...
Flyweight type : 1 do something...
Flyweight type : 3 do something...
Flyweight type : 1 do something...
可以看出,type为3的Flyweight被使用了2次,但只创建了一次实例;type为1的Flyweight被使用了3次,但只创建了一次实例。减少了内存的开销。
总结
- 享元模式适用场景
- 系统中有大量对象。
- 这些对象消耗大量内存。
- 这些对象的状态大部分可以外部化。
- 这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。
- 系统不依赖于这些对象身份,这些对象是不可分辨的。
- 优点
- 大大减少对象的创建,降低系统的内存,使效率提高。
- 缺点
- 提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。