享元模式


享元模式

  • 模式定义:运用共享技术来有效支持大量细粒度的对象,减少内存的占用,提高系统性能。

  • 适用场景:一个系统中,存在大量相似的对象,占用大量内存,且这些对象可以被同意地共享。

  • UML类图: 享元模式UML类图

  • 角色说明:

    • Flyweight(抽象享元角色):所建规定享元对象的公共接口,包含用于接收外部状态的方法。
    • ConcreteFlyweight(具体享元角色):实现Flyweight接口,为内部状态增加存储空间,负责具体享元对象的创建和存储。
    • UnsharedConcreteFlyweight(非共享具体享元角色):为不可共享的享元对象提供存储空间,需要与具体享元角色区别开来。
    • FlyweightFactory(享元工厂角色):负责创建和管理享元角色,确保享元可以被共享和重用。
  • 代码实现:

/**
 * 抽象享元角色
 */
public interface Flyweight {
    void operation(UnsharedConcreteFlyweight state);
}

/**
 * 具体享元角色
 */
public class ConcreteFlyweight implements Flyweight {
    private String intrinsicState;

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

    @Override
    public void operation(UnsharedConcreteFlyweight state) {
        System.out.println("Intrinsic State = " + this.intrinsicState);
        System.out.println("Extrinsic State = " + state.getExtrinsicState());
    }
}

/**
 * 非共享具体享元角色
 */
public class UnsharedConcreteFlyweight implements Flyweight {
    private String extrinsicState;

    UnsharedConcreteFlyweight(String extrinsicState) {
        this.extrinsicState = extrinsicState;
    }

    public String getExtrinsicState() {
        return this.extrinsicState;
    }

    @Override
    public void operation(UnsharedConcreteFlyweight state) {
        System.out.println("UnsharedConcreteFlyweight Operation! Extrinsic State = " + this.extrinsicState);
    }
}

/**
 * 享元工厂角色
 */
public class FlyweightFactory {
    private Map<String, Flyweight> flyweightMap = new HashMap<>();

    public Flyweight getFlyweight(String key) {
        if (flyweightMap.containsKey(key)) {
            return flyweightMap.get(key);
        } else {
            Flyweight flyweight;
            if ("shared".equals(key)) {
                flyweight = new ConcreteFlyweight("Shared ConcreteFlyweight!");
            } else {
                flyweight = new UnsharedConcreteFlyweight("Unshared ConcreteFlyweight!");
            }
            flyweightMap.put(key, flyweight);
            return flyweight;
        }
    }
}

/**
 * 使用享元模式
 */
public class Client {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();
        Flyweight shared = factory.getFlyweight("shared");
        Flyweight unshared = factory.getFlyweight("unshared");

        shared.operation(new UnsharedConcreteFlyweight("SharedFlyweight System!"));
        unshared.operation(new UnsharedConcreteFlyweight("UnsharedFlyweight System!"));
    }
}
  • 优缺点:
    • 优点:
      • 减少对象的创建,降低系统内存占用,提高系统性能。
      • 可以复用已存在的对象,节省系统资源。
      • 通过分离内部状态和外部状态,提高系统的灵活性。
    • 缺点:
      • 享元模式提高逻辑复杂度,需要维护共享对象的状态。
      • 对象共享,对线程安全性提出一定的要求,需要加锁等措施。

以上就是对享元模式的详细介绍,包括定义、适用场景、UML类图、代码实现、优缺点等。要在实际开发中,结合具体场景,合理应用该模式,提高软件开发效率和代码质量。