享元模式(Flyweight Pattern)是一种结构型设计模式,它的主要目的是通过共享已存在的对象来大幅度减少需要创建的对象数量,从而降低系统内存消耗和提高性能。它通过将对象的状态划分为内部状态(Intrinsic State)和外部状态(Extrinsic State),仅共享具有相同内部状态的对象。
// 抽象享元类
public interface Shape {
void draw(int x, int y);
}
// 具体享元类:圆形
public class Circle implements Shape {
private String color; // 外部状态,不共享
// 内部状态,被多个对象共享
private static Map<String, Circle> circlePool = new HashMap<>();
private Circle(String color) {
this.color = color;
}
// 由享元工厂负责调用此方法以复用已有对象或创建新的对象
public static Circle getCircle(String color) {
if (!circlePool.containsKey(color)) {
circlePool.put(color, new Circle(color));
}
return circlePool.get(color);
}
@Override
public void draw(int x, int y) {
System.out.println("Drawing a circle at (" + x + ", " + y + ") with color: " + color);
}
}
// 享元工厂
public class ShapeFactory {
public static Shape getShape(String shapeType, String color) {
if ("circle".equals(shapeType)) {
return Circle.getCircle(color);
} else {
// 其他类型的形状处理...
throw new UnsupportedOperationException("Unsupported shape type");
}
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Shape circle1 = ShapeFactory.getShape("circle", "red");
circle1.draw(10, 10);
Shape circle2 = ShapeFactory.getShape("circle", "blue");
circle2.draw(50, 50);
// 如果颜色“red”已经创建过,则circle3会复用之前的红色圆对象
Shape circle3 = ShapeFactory.getShape("circle", "red");
circle3.draw(100, 100);
}
}
想象你正在运营一家制作个性化T恤衫的公司,每种颜色的T恤都是单独的一件衣服。为了节约成本,你会把每种颜色的T恤看作是共享资源,即每个颜色只准备一件基础T恤。当客户订购某种颜色的T恤时,只要仓库中有对应颜色的基础T恤,就直接使用这件基础T恤进行个性化的打印,而不是每次都生产一件全新的T恤。这就是享元模式的思想,在这里,颜色就是内部状态,而T恤上的文字或图案则是外部状态。