享元模式(Flyweight pattern)是一种结构型设计模式,旨在通过共享对象来减少内存使用和提高性能。它通过将对象的状态分为可共享的内部状态和不可共享的外部状态,来实现对象的共享。内部状态可以被多个对象共享,而外部状态则取决于具体的对象。通过共享内部状态,可以减少系统中相似对象的数量,从而节省内存空间。
- 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;
- }
-
- public void operation(String extrinsicState) {
- System.out.println("Intrinsic State: " + intrinsicState);
- System.out.println("Extrinsic State: " + extrinsicState);
- // 执行具体操作
- }
- }
-
- // 享元工厂类
- class FlyweightFactory {
- private Map
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 Main {
-
- public static void main(String[] args) {
- FlyweightFactory factory = new FlyweightFactory();
-
- // 获取享元对象
- Flyweight flyweight1 = factory.getFlyweight("key1");
- Flyweight flyweight2 = factory.getFlyweight("key1");
-
- // 调用享元对象的操作方法,传入外部状态
- flyweight1.operation("state1");
- flyweight2.operation("state2");
- }
-
-
- }
在这个简单的示例代码中,我们创建了一个具体享元类ConcreteFlyweight,它包含了内部状态intrinsicState。FlyweightFactory是享元工厂类,它维护了一个享元对象的池,并通过getFlyweight方法返回具体的享元对象。内部状态在具体享元对象内部管理,而外部状态由客户端传入。
客户端代码中,首先通过工厂类获取两个享元对象flyweight1和flyweight2,他们共享了同一个享元对象,然后分别调用它们的operation方法,传入外部状态。从而实现了共享内部状态,同时处理各自的外部状态。