享元(Flyweight)

Intent

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

Class Diagram

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

设计模式 - 享元 - 图1

Implementation

  1. public interface Flyweight {
  2. void doOperation(String extrinsicState);
  3. }
  1. public class ConcreteFlyweight implements Flyweight {
  2. private String 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

JDK

Java 利用缓存来加速大量小对象的访问时间。

  • java.lang.Integer#valueOf(int)
  • java.lang.Boolean#valueOf(boolean)
  • java.lang.Byte#valueOf(byte)
  • java.lang.Character#valueOf(char)

设计模式 - 享元 - 图2