Flyweight Pattern

可重用对象的设计模式

ref: 享元模式 | 菜鸟教程

工厂类维护一个关于对象的哈希表,当需要调用对象时,查表,如果有对应对象则返回,如果没有则创建。

使得哈希表中的对象可重用。

  • ShapeFactory 中存一个哈希表,指向所有的已生成对象。
  • 如果外部模块要访问对象,先检查对象是否已存在,不存在则创建,存在则直接返回。
public class Circle implements Shape {
   private String color;
   private int x;
   private int y;
   private int radius;
 
   public Circle(String color){
      this.color = color;     
   }
 
   public void setX(int x) {
      this.x = x;
   }
 
   public void setY(int y) {
      this.y = y;
   }
 
   public void setRadius(int radius) {
      this.radius = radius;
   }
 
   @Override
   public void draw() {
      System.out.println("Circle: Draw() [Color : " + color 
         +", x : " + x +", y :" + y +", radius :" + radius);
   }
}
import java.util.HashMap;
 
public class ShapeFactory {
   private static final HashMap<String, Shape> circleMap = new HashMap<>();
 
   public static Shape getCircle(String color) {
      Circle circle = (Circle)circleMap.get(color);
 
      if(circle == null) {
         circle = new Circle(color);
         circleMap.put(color, circle);
         System.out.println("Creating circle of color : " + color);
      }
      return circle;
   }
}
  • 核心是 Factory 中的哈希表
  • Factory 在 getCircle() 中,如果存在,返回 circle 对象,如果不存在,实例化后返回。