一、定义
享元模式是构造型模式之一,它通过共享数据使得相同对象在内存中仅创建一个实例,以降低系统创建对象实例的性能消耗。
二、享元模式和单例模式的区别
- 单例是该类创建自己的对象,整个应用中只有1个对象
- 享元模式根据需要共享,一般被享元工厂类创建,有可能有多个不同的对象实例进行共享
三、案例
package test.flyweight02;
/**
* 抽象享元角色
*/
public interface Flyweight {
/**
* 业务逻辑处理
*/
void operation(String business);
}
package test.flyweight02;
/**
* ConcreteFlyweight是具体享元角色
*/
public class ConcreteFlyweight implements Flyweight {
private Character character;
/**
* 构造函数,构造方法传入该参数只要为业务考虑是否使用,若不使用该参数,也可不传入。
* @param character
*/
public ConcreteFlyweight(Character character) {
this.character = character;
}
@Override
public void operation(String business) {
System.out.println("业务逻辑处理"+business);
}
}
package test.flyweight02;
import java.util.HashMap;
import java.util.Map;
/**
* 一个享元工厂,用来创建并管理Flyweight对象,主要是用来确保合理地共享Flyweight,
* 当用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或创建一个实例。
*/
public class FlyweightFactory {
private Map<Character,Flyweight> files = new HashMap<>();
public Flyweight factory(Character character){
Flyweight fly = files.get(character);
if(null == fly){
fly = new ConcreteFlyweight(character);
files.put(character,fly);
}
return fly;
}
}
package test.flyweight02;
import java.util.HashSet;
import java.util.Set;
public class Test {
public static void main(String[] args) {
FlyweightFactory factory = new FlyweightFactory();
Flyweight fly1 = factory.factory('a');
fly1.operation("First Call");
Flyweight fly2 = factory.factory('b');
fly2.operation("Second Call");
Flyweight fly3 = factory.factory('a');
fly3.operation("Third Call");
Set<Flyweight> list = new HashSet<>();
list.add(fly1);
list.add(fly2);
list.add(fly3);
System.out.println("总共三次业务逻辑处理,调用的对象次数为"+list.size());
}
}
四、总结
- 享元模式理解起来比较简单,不用想的太过复杂
- 享元模式里面包含了工厂模式
- 使用场景1>系统中存在大量相似对象并消耗大量内存
2>需要缓冲池的场景,对象复用