1. 意图(Intent)
利用共享的方式来支持大量细粒度的对象,这些对象一部分内部状态是相同的。
2. 类图(Class Diagram)

英文是 Flyweight Pattern,不知道是谁最先翻译的这个词,感觉这翻译真的不好理解,我们试着强行关联起来吧。Flyweight 是轻量级的意思,享元分开来说就是 共享 元器件,也就是复用已经生成的对象,这种做法当然也就是轻量级的了。
复用对象最简单的方式是,用一个 HashMap 来存放每次新生成的对象。每次需要一个对象的时候,先到 HashMap 中看看有没有,如果没有,再生成新的对象,然后将这个对象放入 HashMap 中。
public interface Flyweight {void doOperation(String extrinsicState); //外在状态(extrinsicState)}
public class ConcreteFlyweight implements Flyweight {private String intrinsicState; // 内在状态(intrinsicState)public ConcreteFlyweight(String intrinsicState) {this.intrinsicState = intrinsicState;}@Overridepublic void doOperation(String extrinsicState) {System.out.println("Object address: " + System.identityHashCode(this));System.out.println("IntrinsicState: " + intrinsicState);System.out.println("ExtrinsicState: " + extrinsicState);}}
public class FlyweightFactory {private HashMap<String, Flyweight> flyweights = new HashMap<>();Flyweight getFlyweight(String intrinsicState) {if (!flyweights.containsKey(intrinsicState)) {Flyweight flyweight = new ConcreteFlyweight(intrinsicState);flyweights.put(intrinsicState, flyweight);}return flyweights.get(intrinsicState);}}
客户端
public class Client {public static void main(String[] args) {FlyweightFactory factory = new FlyweightFactory();Flyweight flyweight1 = factory.getFlyweight("aa");Flyweight flyweight2 = factory.getFlyweight("aa");flyweight1.doOperation("x");flyweight2.doOperation("y");}}
输出
Object address: 1163157884IntrinsicState: aaExtrinsicState: xObject address: 1163157884IntrinsicState: aaExtrinsicState: y
