设计模式-享元模式示例

2023-05-04 14:39:53 浏览数 (1)

下面我们通过一个简单的Java示例来说明享元模式的使用方法。

我们先定义一个Shape接口,它包含了一个绘制方法:

代码语言:javascript复制
public interface Shape {
    void draw();
}

然后我们定义具体的Shape类,包括Circle和Rectangle:

代码语言:javascript复制
public class Circle implements Shape {

    private String color;

    public Circle(String color) {
        this.color = color;
    }

    @Override
    public void draw() {
        System.out.println("Drawing Circle with color "   color);
    }
}

public class Rectangle implements Shape {

    private String color;

    public Rectangle(String color) {
        this.color = color;
    }

    @Override
    public void draw() {
        System.out.println("Drawing Rectangle with color "   color);
    }
}

在这里,我们将对象的颜色作为其内部状态。

接下来,我们定义一个ShapeFactory类,它用于管理共享对象:

代码语言:javascript复制
public class ShapeFactory {

    private static final Map<String, Shape> shapes = new HashMap<>();

    public static Shape getShape(String color, String type) {
        Shape shape = shapes.get(color);

        if (shape == null) {
            if (type.equalsIgnoreCase("circle")) {
                shape = new Circle(color);
            } else if (type.equalsIgnoreCase("rectangle")) {
                shape = new Rectangle(color);
            }

            shapes.put(color, shape);
        }

        return shape;
    }
}

在这里,我们使用HashMap来维护已经存在的对象,如果客户端请求一个新的对象,那么我们先检查HashMap中是否已经有相应的对象,如果有,则直接返回已经存在的对象;如果没有,则创建一个新的对象,并将其添加到HashMap中。

最后,我们可以使用以下代码来测试我们的享元模式:

代码语言:javascript复制
public class Client {
    public static void main(String[] args) {
        Shape redCircle = ShapeFactory.getShape("red", "circle");
        Shape blueCircle = ShapeFactory.getShape("blue", "circle");
        Shape redRectangle = ShapeFactory.getShape("red", "rectangle");
        Shape blueRectangle = ShapeFactory.getShape("blue", "rectangle");

        redCircle.draw();
        blueCircle.draw();
        redRectangle.draw();
        blueRectangle.draw();
    }
}

输出结果如下:

代码语言:javascript复制
Drawing Circle with color red
Drawing Circle with color blue
Drawing Rectangle with color red
Drawing Rectangle with color blue

在这里,我们创建了4个Shape对象,其中两个是Circle对象,两个是Rectangle对象。对于每个颜色,我们只创建了一个对象,这就是享元模式的核心思想。

0 人点赞