享元模式表示 “通过存储并重用已经存在的相似对象,当找不到匹配对象时创建新对象”

享元模式的优点

  • 它减少了对象的数量。
  • 它减少了对象持久化时所需的内存和存储设备的数量。

享元模式的使用

适用于以下情况:

  • 当一个应用程序使用大量对象时。
  • 当由于对象数量过多导致存储成本高昂时。
  • 当应用程序不依赖于对象标识时。

享元模式示例

让我们通过一个简单的 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 对象来减少内存消耗。这就是享元模式的精髓:重用现有的相似对象以节省资源。

标签: Design Patterns, Design Patterns教程, 设计模式, 软件设计, 结构型模式, 行为型模式, 单例模式, 工厂模式, 观察者模式, 中介者模式, 访问者模式