Design Patterns教程-享元模式
享元模式表示 “通过存储并重用已经存在的相似对象,当找不到匹配对象时创建新对象”。
享元模式的优点
- 它减少了对象的数量。
- 它减少了对象持久化时所需的内存和存储设备的数量。
享元模式的使用
适用于以下情况:
- 当一个应用程序使用大量对象时。
- 当由于对象数量过多导致存储成本高昂时。
- 当应用程序不依赖于对象标识时。
享元模式示例
让我们通过一个简单的 Java 示例来理解享元模式。
实现享元模式
步骤 1
创建一个 Shape 接口。
文件:Shape.java
public interface Shape {
void draw();
}
步骤 2
创建一个实现 Shape 接口的 Circle 类。
文件: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 来生成基于给定信息的实体类的对象。
文件:ShapeFactory.java
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;
}
}
步骤 4
使用工厂类 ShapeFactory 获取所需的 Circle 对象。
文件: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);
}
}
输出
Creating circle of color : Red
Circle: Draw() [Color : Red, x : 36, y :10, radius :100
Creating circle of color : Green
Circle: Draw() [Color : Green, x : 30, y :21, radius :100
Creating circle of color : Blue
Circle: Draw() [Color : Blue, x : 66, y :78, radius :100
Creating circle of color : White
Circle: Draw() [Color : White, x : 34, y :93, radius :100
Creating circle of color : Black
Circle: Draw() [Color : Black, x : 65, y :34, radius :100
Circle: Draw() [Color : Red, x : 60, y :24, radius :100
Circle: Draw() [Color : Green, x : 29, y :74, radius :100
Circle: Draw() [Color : Blue, x : 19, y :10, radius :100
Circle: Draw() [Color : White, x : 90, y :23, radius :100
Circle: Draw() [Color : Black, x : 45, y :72, radius :100
Circle: Draw() [Color : Red, x : 67, y :53, radius :100
Circle: Draw() [Color : Green, x : 83, y :15, radius :100
Circle: Draw() [Color : Blue, x : 2, y :90, radius :100
Circle: Draw() [Color : White, x : 92, y :45, radius :100
Circle: Draw() [Color : Black, x : 77, y :88, radius :100
Circle: Draw() [Color : Red, x : 68, y :40, radius :100
Circle: Draw() [Color : Green, x : 45, y :56, radius :100
Circle: Draw() [Color : Blue, x : 50, y :12, radius :100
Circle: Draw() [Color : White, x : 10, y :67, radius :100
Circle: Draw() [Color : Black, x : 77, y :72, radius :100
在上述示例中,我们通过 ShapeFactory
获取 Circle
对象,并通过共享相同颜色的 Circle
对象来减少内存消耗。这就是享元模式的精髓:重用现有的相似对象以节省资源。