1. 意图(Intent)

利用共享的方式来支持大量细粒度的对象,这些对象一部分内部状态是相同的。

2. 类图(Class Diagram)

5f5c22d5-9c0e-49e1-b5b0-6cc7032724d4.png

  • Flyweight:享元对象
  • IntrinsicState:内部状态,享元对象共享内部状态
  • ExtrinsicState:外部状态,每个享元对象的外部状态不同

    3. 实现(Implementation)

英文是 Flyweight Pattern,不知道是谁最先翻译的这个词,感觉这翻译真的不好理解,我们试着强行关联起来吧。Flyweight 是轻量级的意思,享元分开来说就是 共享 元器件,也就是复用已经生成的对象,这种做法当然也就是轻量级的了。

复用对象最简单的方式是,用一个 HashMap 来存放每次新生成的对象。每次需要一个对象的时候,先到 HashMap 中看看有没有,如果没有,再生成新的对象,然后将这个对象放入 HashMap 中。

  1. public interface Flyweight {
  2. void doOperation(String extrinsicState); //外在状态(extrinsicState)
  3. }
  1. public class ConcreteFlyweight implements Flyweight {
  2. private String intrinsicState; // 内在状态(intrinsicState)
  3. public ConcreteFlyweight(String intrinsicState) {
  4. this.intrinsicState = intrinsicState;
  5. }
  6. @Override
  7. public void doOperation(String extrinsicState) {
  8. System.out.println("Object address: " + System.identityHashCode(this));
  9. System.out.println("IntrinsicState: " + intrinsicState);
  10. System.out.println("ExtrinsicState: " + extrinsicState);
  11. }
  12. }
  1. public class FlyweightFactory {
  2. private HashMap<String, Flyweight> flyweights = new HashMap<>();
  3. Flyweight getFlyweight(String intrinsicState) {
  4. if (!flyweights.containsKey(intrinsicState)) {
  5. Flyweight flyweight = new ConcreteFlyweight(intrinsicState);
  6. flyweights.put(intrinsicState, flyweight);
  7. }
  8. return flyweights.get(intrinsicState);
  9. }
  10. }

客户端

  1. public class Client {
  2. public static void main(String[] args) {
  3. FlyweightFactory factory = new FlyweightFactory();
  4. Flyweight flyweight1 = factory.getFlyweight("aa");
  5. Flyweight flyweight2 = factory.getFlyweight("aa");
  6. flyweight1.doOperation("x");
  7. flyweight2.doOperation("y");
  8. }
  9. }

输出

  1. Object address: 1163157884
  2. IntrinsicState: aa
  3. ExtrinsicState: x
  4. Object address: 1163157884
  5. IntrinsicState: aa
  6. ExtrinsicState: y