新彩天欢迎您!
幻海优品

设计模式 - Flyweight模式

Flyweight模式主要用于减少创建的对象数量,减少内存占用并提高性能.这种类型的设计模式属于结构模式,因为此模式提供了减少对象数量的方法,从而改善了应用程序的对象结构.

Flyweight模式尝试通过存储它们来重用已存在的类似对象并且在找不到匹配对象时创建新对象.我们将通过绘制20个不同位置的圆圈来演示此模式,但我们将仅创建5个对象.只有5种颜色可用,因此颜色属性用于检查已存在的 Circle 对象.

实施

我们要去创建 Shape 接口和实现 Shape 接口的具体类 Circle .工厂类 ShapeFactory 被定义为下一步.

ShapeFactory 有一个 HashMap 将键作为 Circle 对象的颜色.每当请求为 ShapeFactory 创建特定颜色的圆圈时,它会检查 HashMap 中的圆形对象,如果找到 Circle 的对象,返回该对象,否则创建一个新对象,存储在hashmap中以供将来使用,并返回给客户端.

FlyWeightPatternDemo ,我们的演示类,将使用 ShapeFactory 获取 Shape 对象.它会将信息(红色/绿色/蓝色/黑色/白色)传递给 ShapeFactory 以获得所需颜色的圆圈.

Flyweight Pattern UML Diagram

步骤1

创建一个界面.

Shape.java

public interface Shape {   void draw();}

步骤2

创建实现相同界面的具体类.

Circle.java

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

步骤3

创建工厂以生成具体类的对象基于给定的信息.

ShapeFactory.java

import java.util.HashMap;public class ShapeFactory {   // Uncomment the compiler directive line and   // javac *.java will compile properly.   // @SuppressWarnings("unchecked")   private static final HashMap 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;   }}

步骤4

使用工厂获取具体类的对象通过传递颜色等信息.

FlyweightPatternDemo.java

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

步骤5

验证输出.

Creating circle of color : BlackCircle: Draw() [Color : Black, x : 36, y :71, radius :100Creating circle of color : GreenCircle: Draw() [Color : Green, x : 27, y :27, radius :100Creating circle of color : WhiteCircle: Draw() [Color : White, x : 64, y :10, radius :100Creating circle of color : RedCircle: Draw() [Color : Red, x : 15, y :44, radius :100Circle: Draw() [Color : Green, x : 19, y :10, radius :100Circle: Draw() [Color : Green, x : 94, y :32, radius :100Circle: Draw() [Color : White, x : 69, y :98, radius :100Creating circle of color : BlueCircle: Draw() [Color : Blue, x : 13, y :4, radius :100Circle: Draw() [Color : Green, x : 21, y :21, radius :100Circle: Draw() [Color : Blue, x : 55, y :86, radius :100Circle: Draw() [Color : White, x : 90, y :70, radius :100Circle: Draw() [Color : Green, x : 78, y :3, radius :100Circle: Draw() [Color : Green, x : 64, y :89, radius :100Circle: Draw() [Color : Blue, x : 3, y :91, radius :100Circle: Draw() [Color : Blue, x : 62, y :82, radius :100Circle: Draw() [Color : Green, x : 97, y :61, radius :100Circle: Draw() [Color : Green, x : 86, y :12, radius :100Circle: Draw() [Color : Green, x : 38, y :93, radius :100Circle: Draw() [Color : Red, x : 76, y :82, radius :100Circle: Draw() [Color : Blue, x : 95, y :82, radius :100

免责声明:以上内容(如有图片或视频亦包括在内)有转载其他网站资源,如有侵权请联系删除