文章摘要: 享元模式使用总结。
简介
简要说明
- 享元模式(Flyweight Pattern)是一种结构型设计模式。
- 通过共享尽可能多的相似对象来减少内存的使用,提高程序的性能。
主要功能
- 减少创建对象的数量,减少内存占用和提高性能。
- 提供共享的接口,使得相同的对象可以被复用。
注意事项
- 确保对象是不可变对象,以保证共享的安全性。
- 分离内部状态(固有属性)和外部状态(可变属性),内部状态可以被共享,外部状态则不可以。
- 需要管理对象池,以实现对象的共享。
适用场景
- 当一个程序中使用了大量的对象。
- 这些对象造成了很大的内存开销。
- 这些对象的大多数状态可以外部化。
- 这些对象是不可变的。
Java 8
案例
import java.util.HashMap;
import java.util.Map;
// 享元接口,定义了享元对象需要实现的操作
interface Flyweight {
void operation(String extrinsicState);
}
// 具体的享元类,实现了享元接口
class ConcreteFlyweight implements Flyweight {
// 内部状态,即享元对象的固有属性,可以被共享
private String intrinsicState;
// 构造方法,初始化内部状态
public ConcreteFlyweight(String intrinsicState) {
this.intrinsicState = intrinsicState;
}
// 实现operation方法,使用外部状态
@Override
public void operation(String extrinsicState) {
System.out.println("Intrinsic State = " + this.intrinsicState);
System.out.println("Extrinsic State = " + extrinsicState);
}
}
// 享元工厂,负责创建和管理享元对象
class FlyweightFactory {
// 享元池,用于存储享元对象,以便复用
private Map<String, Flyweight> flyweights = new HashMap<>();
// 获取享元对象的方法
public Flyweight getFlyweight(String key) {
// 如果享元池中存在该对象,则直接返回
if (flyweights.containsKey(key)) {
return flyweights.get(key);
} else {
// 如果享元池中不存在该对象,则创建一个新的享元对象,并放入享元池中
Flyweight flyweight = new ConcreteFlyweight(key);
flyweights.put(key, flyweight);
return flyweight;
}
}
}
// 客户端代码,使用享元模式
public class FlyweightPatternDemo {
public static void main(String[] args) {
// 创建享元工厂
FlyweightFactory factory = new FlyweightFactory();
// 通过享元工厂获取享元对象
Flyweight flyweight1 = factory.getFlyweight("key1");
Flyweight flyweight2 = factory.getFlyweight("key2");
// 操作享元对象,传入外部状态
flyweight1.operation("Extrinsic State A");
flyweight2.operation("Extrinsic State B");
// 再次获取享元对象,此时将复用已存在的享元对象
Flyweight flyweight3 = factory.getFlyweight("key1");
flyweight3.operation("Extrinsic State C");
// 检查flyweight1和flyweight3是否为同一个对象
System.out.println(flyweight1 == flyweight3); // 输出true
}
}
注释
- 在这个例子中,我们定义了一个享元接口
Flyweight和一个具体的享元类ConcreteFlyweight。享元工厂FlyweightFactory负责创建和管理享元对象,并使用一个HashMap作为享元池来存储共享的享元对象。 - 客户端代码通过享元工厂获取享元对象,并传入外部状态进行操作。当请求相同的享元对象时,享元工厂将返回已经创建的享元对象,从而实现对象的共享。在最后,我们检查了两个引用是否指向同一个对象,以验证享元对象的共享。