概述
享元模式(Flyweight Pattern)
是一种结构型设计模式,它通过共享细粒度对象来支持大量细粒度对象的高效共享,避免对象的多次创建,从而减少内存使用。享元模式非常适合用于实现那些包含大量相似对象的系统。
使用场景
- 系统需要大量细粒度对象,这些对象的大部分状态是相同的。
- 通过共享对象可以显著减少内存使用。
- 对象的状态可以分为内部状态和外部状态,内部状态可以共享,而外部状态是特定于对象的。
结构
享元模式的结构包含以下几个部分:
- 享元(Flyweight):定义一个接口,供具体享元类实现。
- 具体享元(ConcreteFlyweight):实现享元接口,并且共享对象的内部状态。
- 非共享具体享元(UnsharedConcreteFlyweight):并非所有的享元对象都可以共享,非共享具体享元类不需要实现共享功能。
- 享元工厂(FlyweightFactory):创建和管理享元对象,确保享元对象可以被共享。
代码实现
下面是一个 Java 实现享元模式的例子,展示了如何使用享元模式来管理大量相似的对象。
示例代码:
import java.util.HashMap;
import java.util.Map;
// Flyweight 接口
interface Flyweight {
void operation(String externalState);
}
// 具体享元类
class ConcreteFlyweight implements Flyweight {
private String intrinsicState;
public ConcreteFlyweight(String intrinsicState) {
this.intrinsicState = intrinsicState;
}
@Override
public void operation(String externalState) {
System.out.println("Intrinsic State: " + intrinsicState + ", External State: " + externalState);
}
}
// 非共享具体享元类
class UnsharedConcreteFlyweight implements Flyweight {
private String allState;
public UnsharedConcreteFlyweight(String allState) {
this.allState = allState;
}
@Override
public void operation(String externalState) {
System.out.println("All State: " + allState + ", External State: " + externalState);
}
}
// 享元工厂类
class FlyweightFactory {
private Map<String, Flyweight> flyweights = new HashMap<>();
public Flyweight getFlyweight(String key) {
if (!flyweights.containsKey(key)) {
flyweights.put(key, new ConcreteFlyweight(key));
}
return flyweights.get(key);
}
}
// 客户端代码
public class FlyweightPatternDemo {
public static void main(String[] args) {
FlyweightFactory factory = new FlyweightFactory();
Flyweight flyweight1 = factory.getFlyweight("A");
flyweight1.operation("First Call");
Flyweight flyweight2 = factory.getFlyweight("A");
flyweight2.operation("Second Call");
Flyweight flyweight3 = factory.getFlyweight("B");
flyweight3.operation("First Call");
UnsharedConcreteFlyweight unsharedFlyweight = new UnsharedConcreteFlyweight("Unshared");
unsharedFlyweight.operation("First Call");
}
}
解释
- Flyweight:定义了一个接口,
ConcreteFlyweight
和UnsharedConcreteFlyweight
实现了该接口。 - ConcreteFlyweight:具体享元类,实现了享元接口,并且包含可以共享的内部状态。
- UnsharedConcreteFlyweight:非共享具体享元类,实现了享元接口,但其状态不能共享。
- FlyweightFactory:享元工厂类,用于创建和管理享元对象,确保享元对象可以被共享。
- FlyweightPatternDemo:客户端代码,通过享元工厂获取享元对象,并执行操作。