亨元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来最大限度地减少内存使用和提高性能。该模式适用于需要创建大量相似对象的情况,其中许多对象具有相同的状态。通过共享相同的状态,亨元模式可以减少内存消耗,并使对象的创建和管理更加高效。
以下是亨元模式的几个关键角色:
- 亨元(Flyweight):表示一个共享的对象,存储了内部状态和外部状态。内部状态是指对象共享的部分,而外部状态是对象的变化部分,需要在运行时进行传递。
- 亨元工厂(Flyweight Factory):负责创建和管理亨元对象。它维护一个亨元池(Flyweight Pool)用于存储已经创建的亨元对象,并根据客户端的请求返回相应的亨元对象。
下面是一个示例,展示了如何使用亨元模式来共享相同的字符串对象:
import java.util.HashMap;
import java.util.Map;
// 亨元接口
interface Flyweight {
void display();
}
// 具体的亨元实现类
class ConcreteFlyweight implements Flyweight {
private String intrinsicState;
public ConcreteFlyweight(String intrinsicState) {
this.intrinsicState = intrinsicState;
}
public void display() {
System.out.println("Intrinsic State: " + intrinsicState);
}
}
// 亨元工厂类
class FlyweightFactory {
private Map<String, Flyweight> flyweightPool;
public FlyweightFactory() {
flyweightPool = new HashMap<>();
}
public Flyweight getFlyweight(String key) {
if (flyweightPool.containsKey(key)) {
return flyweightPool.get(key);
} else {
Flyweight flyweight = new ConcreteFlyweight(key);
flyweightPool.put(key, flyweight);
return flyweight;
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
FlyweightFactory factory = new FlyweightFactory();
// 获取共享对象
Flyweight flyweight1 = factory.getFlyweight("A");
Flyweight flyweight2 = factory.getFlyweight("B");
Flyweight flyweight3 = factory.getFlyweight("A");
// 调用共享对象的方法
flyweight1.display(); // 输出:"Intrinsic State: A"
flyweight2.display(); // 输出:"Intrinsic State: B"
flyweight3.display(); // 输出:"Intrinsic State: A"
// 验证对象是否为同一个对象
System.out.println(flyweight1 == flyweight2); // 输出:false
System.out.println(flyweight1 == flyweight3); // 输出:true
}
}
在上述示例中,ConcreteFlyweight
表示具体的亨元实现类,它包含了一个内部状态 intrinsicState
,用于存储共享的状态。FlyweightFactory
是亨元工厂类,负责创建和管理亨元对象。它维护了一个 flyweightPool
用于存储已经创建的亨元对象,并根据客户端的请求返回相应的亨元对象。
在客户端代码中,通过亨元工厂获取共享对象,并调用其方法。可以看到,虽然创建了两个具有相同内部状态的亨元对象,但实际上它们是同一个对象,因为它们共享相同的状态。这样可以减少内存消耗,并提高性能。
亨元模式在需要创建大量相似对象且内部状态可以共享的场景中非常有用,它能够有效地提高系统的性能和资源利用率。