享元模式是一种结构型设计模式,旨在通过共享对象以减少内存使用和提高性能。它适用于需要大量相似对象的场景,其中对象的大部分状态是可以共享的。

在享元模式中,存在两种类型的状态:内部状态和外部状态。内部状态是可以被多个对象共享的,而外部状态则取决于具体的场景和对象。

以下是享元模式的一些关键要素和示例:

1. 享元接口(Flyweight): 定义了享元对象的接口,包括对内部状态和外部状态的操作。
public interface Flyweight {
    void operation(String externalState);
}

2. 具体享元(ConcreteFlyweight): 实现了享元接口,包含内部状态,并能根据外部状态进行操作。
public class ConcreteFlyweight implements Flyweight {
    private String intrinsicState;  // 内部状态

    public ConcreteFlyweight(String intrinsicState) {
        this.intrinsicState = intrinsicState;
    }

    @Override
    public void operation(String externalState) {
        System.out.println("ConcreteFlyweight: Intrinsic " + intrinsicState + ", Extrinsic " + externalState);
    }
}

3. 享元工厂(FlyweightFactory): 负责创建和管理享元对象,确保相同内部状态的对象被共享。
import java.util.HashMap;
import java.util.Map;

public 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);
    }
}

4. 客户端代码: 使用享元模式的客户端代码通过享元工厂获取享元对象,然后传递外部状态进行操作。
public class Client {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();

        Flyweight flyweight1 = factory.getFlyweight("A");
        flyweight1.operation("External State 1");

        Flyweight flyweight2 = factory.getFlyweight("A");
        flyweight2.operation("External State 2");

        Flyweight flyweight3 = factory.getFlyweight("B");
        flyweight3.operation("External State 3");
    }
}

在这个例子中,对象"A"的内部状态是共享的,因此在第二次获取相同内部状态的对象时,实际上是获取了已存在的对象,而不是创建新的对象。这样可以节省内存并提高性能,特别是当有大量相似对象需要创建时。


转载请注明出处:http://www.pingtaimeng.com/article/detail/13948/设计模式