在享元模式中,存在两种类型的状态:内部状态和外部状态。内部状态是可以被多个对象共享的,而外部状态则取决于具体的场景和对象。
以下是享元模式的一些关键要素和示例:
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.zyzy.cn/article/detail/13948/设计模式