1. 概念
享元模式(Flyweight Pattern)是一种软件设计模式,旨在有效地支持大量细粒度的对象。它主要用于减少内存使用和提高性能,通过共享尽可能多的相似对象来实现这一目的。
在享元模式中,对象分为两种:内部状态(Intrinsic State)和外部状态(Extrinsic State)。内部状态是对象共享的部分,而外部状态是对象独立的部分。享元模式通过共享内部状态来减少对象的数量,而外部状态则可以通过参数化来个性化不同的对象。
这个模式在需要创建大量相似对象但又需要保持系统性能的场景中非常有用。典型的例子是图形编辑软件中的图元对象,其中大量图元可能共享相同的形状和颜色,但具有不同的位置。
总的来说,享元模式通过共享相似对象的方式来节省内存和提高性能,但需要注意的是,对于对象的外部状态需要进行正确的管理,以确保不会造成状态混乱。
2. 示例
演示了如何使用享元模式来共享相似对象
import java.util.HashMap;
// 享元工厂,负责创建和管理享元对象
class ShapeFactory {
private static final HashMap<String, Shape> shapes = new HashMap<>();
// 获取具体形状的方法
public static Shape getShape(String color) {
Shape shape = shapes.get(color);
// 如果不存在对应颜色的形状,则创建新的形状对象
if (shape == null) {
shape = new Circle(color);
shapes.put(color, shape);
System.out.println("Creating " + color + " circle shape.");
}
return shape;
}
}
// 抽象享元类
interface Shape {
void draw();
}
// 具体享元类
class Circle implements Shape {
private final String color;
public Circle(String color) {
this.color = color;
}
@Override
public void draw() {
System.out.println("Drawing circle with color: " + color);
}
}
// 客户端类
public class FlyweightPatternExample {
public static void main(String[] args) {
// 创建不同颜色的圆形对象
Shape redCircle = ShapeFactory.getShape("Red");
Shape greenCircle = ShapeFactory.getShape("Green");
Shape blueCircle = ShapeFactory.getShape("Blue");
// 使用享元对象绘制圆形
redCircle.draw();
greenCircle.draw();
blueCircle.draw();
// 再次请求相同颜色的圆形,应该直接使用之前创建的对象,而不是创建新的对象
Shape redCircle2 = ShapeFactory.getShape("Red");
redCircle2.draw();
}
}
这个示例中,ShapeFactory
是享元工厂类,负责创建和管理具体的享元对象。Circle
是具体的享元类,表示圆形对象。在客户端代码中,我们通过工厂类获取不同颜色的圆形对象,如果请求的颜色已经存在对应的圆形对象,则直接返回之前创建的对象,否则创建新的对象。