面试题答案
一键面试享元模式实现步骤
- 定义享元接口:确定享元对象需要实现的方法,这些方法通常与共享状态相关。
- 创建具体享元类:实现享元接口,每个具体享元类代表一个可共享的对象实例,包含内部状态(即共享状态)。
- 创建享元工厂:负责创建和管理享元对象。它通常使用一个集合(如
HashMap
)来存储已经创建的享元对象,以便重复使用。 - 客户端使用:客户端通过享元工厂获取享元对象,并传入外部状态(不可共享的状态)来调用享元对象的方法。
代码示例
// 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
类展示了如何通过享元工厂获取享元对象,并传入外部状态调用其方法。这里flyweight1
和flyweight2
实际上是同一个对象,体现了享元模式的共享特性。