Java设计模式之享元模式

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。

Java中String的实现就是一个典型的享元模式应用,Java中的String存在字符串常量池中,Java会确保一个字符串常量在常量池中只有一个拷贝。数据库连接池也是一个比较电信的享元模式应用,可简单理解为先初始化一定数量的数据库连接,当需要获取连接的时候从连接池中去获得一个可用连接,当不存在可用连接时,再去扩展连接池的连接数量。

下面是一个关于工厂模式、享元模式结合使用的例子:

// 创建Shape接口,并定义一个绘制方法
public interface Shape {
  void draw();
}
// 创建Circle类来实现Shape接口,定义Circle的相关属性,并且实现绘制(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;

// 创建一个ShapeFactory工厂类,通过HashMap来存储对象,通过getCircle方法从map中取得现有对象或生成新的对象
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;
  }
}
// 随机输入color参数,从factory中获得对象
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);
  }

参考资料:

本文标题:Java设计模式之享元模式

本文链接:http://yedward.net/?id=396

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章