MST

星途 面试题库

面试题:Java中享元模式的基本实现步骤

请描述在Java中实现享元模式的主要步骤,并给出一个简单的代码示例,说明如何创建享元工厂以及获取和使用享元对象。
17.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

享元模式实现步骤

  1. 定义享元接口:确定享元对象需要实现的方法,这些方法通常与共享状态相关。
  2. 创建具体享元类:实现享元接口,每个具体享元类代表一个可共享的对象实例,包含内部状态(即共享状态)。
  3. 创建享元工厂:负责创建和管理享元对象。它通常使用一个集合(如HashMap)来存储已经创建的享元对象,以便重复使用。
  4. 客户端使用:客户端通过享元工厂获取享元对象,并传入外部状态(不可共享的状态)来调用享元对象的方法。

代码示例

// 1. 定义享元接口
interface Flyweight {
    void operation(String extrinsicState);
}

// 2. 创建具体享元类
class ConcreteFlyweight implements Flyweight {
    private String intrinsicState;

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

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

// 3. 创建享元工厂
class FlyweightFactory {
    private static final java.util.Map<String, Flyweight> flyweights = new java.util.HashMap<>();

    public Flyweight getFlyweight(String key) {
        Flyweight flyweight = flyweights.get(key);
        if (flyweight == null) {
            flyweight = new ConcreteFlyweight(key);
            flyweights.put(key, flyweight);
        }
        return flyweight;
    }
}

// 4. 客户端使用
public class Client {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();
        Flyweight flyweight1 = factory.getFlyweight("A");
        flyweight1.operation("First Use");

        Flyweight flyweight2 = factory.getFlyweight("A");
        flyweight2.operation("Second Use");
    }
}

在上述示例中:

  • Flyweight接口定义了享元对象的操作方法。
  • ConcreteFlyweight是具体的享元类,实现了Flyweight接口,它包含内部状态intrinsicState
  • FlyweightFactory负责创建和管理享元对象,通过HashMap来存储已创建的享元对象。
  • Client类展示了如何通过享元工厂获取享元对象,并传入外部状态调用其方法。这里flyweight1flyweight2实际上是同一个对象,体现了享元模式的共享特性。