这个轻量级模式真的是一个轻量级模式吗?

时间:2015-05-24 20:06:14

标签: java design-patterns

这是我正在阅读的教程:

http://www.tutorialspoint.com/design_pattern/flyweight_pattern.htm

这里的代码我认为不是所说的flyweight模式:

public interface Shape {
   void draw();
}

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

public class FlyweightPatternDemo {
   private static final String colors[] = { "Red", "Green", "Blue", "White", "Black" };
   public static void main(String[] args) {

      for(int i=0; i < 20; ++i) {
         Circle circle = (Circle)ShapeFactory.getCircle(getRandomColor());
         circle.setX(getRandomX());
         circle.setY(getRandomY());
         circle.setRadius(100);
         circle.draw();
      }
   }
   private static String getRandomColor() {
      return colors[(int)(Math.random()*colors.length)];
   }
   private static int getRandomX() {
      return (int)(Math.random()*100 );
   }
   private static int getRandomY() {
      return (int)(Math.random()*100);
   }
}

这似乎不是一个flyweight模式,因为根据维基百科“flyweight是一个通过与其他类似对象共享尽可能多的数据来最小化内存使用的对象”。换句话说,我看不到具有内在和外在数据的对象。在这里,我只能看到一个带有某种缓存系统的工厂。

有人可以证明为什么这是或不是飞重模式?

1 个答案:

答案 0 :(得分:2)

当您通过ShapeFactory创建新的圆圈时,将返回已创建的实例,以防所需的颜色存在。通过这种方式,您可以重复使用已创建的Circle实例(他们&#34;使用相同颜色的圆圈共享&#34;他们的数据)并最大限度地减少内存消耗。

那就是说,这段代码存在一些问题。例如,Circle对象是可变的,因此如果您开始修改创建的圆,则同样颜色的所有其他圆也将被修改。

这完全是线程不安全的。