下面我们通过一个简单的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对象。对于每个颜色,我们只创建了一个对象,这就是享元模式的核心思想。