享元模式(Flyweight Pattern): 利用共享的方式来支持大量细粒度的对象,这些对象一部分内部状态是相同的。 它让某个类的一个实例能用来提供许多”虚拟实例”。

意图

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

类图

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

image.png

实现

  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. }

JDK

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

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