网站建设公司哪家好,天水建设局网站渣土治理,深圳建站公司兴田德润电话多少,惠州地区网站建设公司介绍
享元模式#xff08;Flyweight Pattern#xff09;是一种结构型设计模式#xff0c;它通过共享对象来减少内存使用#xff0c;尤其是对于大量相似对象的场景。享元模式通常与工厂模式和单例模式结合使用#xff0c;从而有效地控制和复用对象的创建。在享元模式中Flyweight Pattern是一种结构型设计模式它通过共享对象来减少内存使用尤其是对于大量相似对象的场景。享元模式通常与工厂模式和单例模式结合使用从而有效地控制和复用对象的创建。在享元模式中享元对象的核心思想是将不可变的部分共享的状态和可变的部分外部状态进行区分从而优化系统性能。
工厂模式与单例模式
享元模式与工厂模式紧密结合享元工厂负责管理共享的享元对象。工厂模式使得创建和管理享元对象变得统一和高效。除此之外单例模式也常用于确保享元工厂在整个系统中唯一避免重复创建享元工厂实例从而节省资源。
下面代码采用静态内部类的方式实现单例模式这种方式不仅能保证线程安全还能确保只有在首次使用时才创建实例具有懒加载特性。但是枚举才是最优的单例模式实现。感兴趣的同学可以参考这篇文章单例模式最优解----枚举
享元模式的结构
享元模式的核心结构包含以下几个角色 抽象享元角色Flyweight这是一个接口或抽象类声明了享元对象的公共方法。享元对象可以通过这些方法向外界提供共享的数据同时也可以设置外部数据。 具体享元角色Concrete Flyweight实现了抽象享元接口提供了共享的内部状态。在享元工厂中这些具体享元对象可以通过共享池来复用。 非共享的具体享元角色Unshared Flyweight这些对象不适合共享通常包含外部状态。每次使用时都会直接实例化。 享元工厂角色Flyweight Factory负责管理和提供享元对象。享元工厂会检查是否已经有符合要求的享元对象如果没有则创建新的对象并返回。
享元模式中的共享与非共享状态
享元模式中有两种主要状态 内部状态这些状态是享元对象的一部分并且是共享的。内部状态不会随着环境的改变而改变。 外部状态这些状态是依赖于外部环境的通常随时间、位置等变化。外部状态不会存储在享元对象中而是通过方法传递给享元对象。
享元模式的关键在于将这两种状态进行分离只有内部状态才能被共享外部状态则由客户端负责传递。
示例图形编辑器中的享元模式 在这个例子中我们设计了一个简单的图形编辑器其中有两种共享形状圆形和正方形。每个图形的颜色作为内部状态共享而位置作为外部状态传递。通过享元模式我们可以复用相同颜色的图形对象并为每个图形传递不同的位置。如果没有采用共享的方式每次调用图形时都会创建新的对象这样会导致大量内存浪费。但位置不能复用这是根据外部环境改变的。
代码实现
// 抽象享元角色
interface Shape {void draw(String externalState);
}// 具体享元类 - 圆形内部状态是共享的
class Circle implements Shape {private String color; // 内部状态颜色是共享的public Circle(String color) {this.color color;}Overridepublic void draw(String externalState) {System.out.println(Drawing Circle with color: color at position: externalState);}
}// 具体享元类 - 正方形内部状态是共享的
class Square implements Shape {private String color; // 内部状态颜色是共享的public Square(String color) {this.color color;}Overridepublic void draw(String externalState) {System.out.println(Drawing Square with color: color at position: externalState);}
}// 非共享的具体享元 - 线条完全依赖外部状态
class Line implements Shape {Overridepublic void draw(String externalState) {System.out.println(Drawing Line at position: externalState);}
}// 享元工厂
class ShapeFactory {private MapString, Shape shapeMap new HashMap();private ShapeFactory() {} // 私有构造函数防止外部创建实例// 静态内部类实现单例模式private static class SingletonHelper {private static final ShapeFactory INSTANCE new ShapeFactory();}// 获取单例实例public static ShapeFactory getInstance() {return SingletonHelper.INSTANCE;}// 获取共享的享元对象public Shape getShape(String type, String color) {String key type color;if (!shapeMap.containsKey(key)) {if (type.equals(Circle)) {shapeMap.put(key, new Circle(color));} else if (type.equals(Square)) {shapeMap.put(key, new Square(color));}}return shapeMap.get(key);}
}public class FlyweightPatternExample {public static void main(String[] args) {// 享元工厂ShapeFactory shapeFactory ShapeFactory.getInstance();// 创建和使用共享的享元对象Shape circle1 shapeFactory.getShape(Circle, Red);Shape circle2 shapeFactory.getShape(Circle, Red);Shape square1 shapeFactory.getShape(Square, Blue);// 绘制图形时外部状态位置会变化circle1.draw(10, 20); // 外部状态为位置circle2.draw(15, 25);square1.draw(30, 40);// 非共享的享元对象直接实例化Shape line new Line();line.draw(50, 60); // 外部状态为位置}
}代码说明 共享的具体享元类 Circle 和 Square 是共享的享元对象它们的颜色是内部状态。享元工厂会根据颜色来共享这些对象。 非共享的具体享元类 Line 类是非共享的享元类它不存储任何内部状态而是每次都需要通过外部状态位置来绘制。它没有参与享元工厂的共享池。 享元工厂 ShapeFactory 类负责管理和返回共享的享元对象。它使用一个 Map 来缓存已创建的享元对象避免重复创建相同的对象。 客户端使用 客户端首先通过享元工厂请求共享的图形对象如红色圆形。如果该对象已存在则直接返回否则创建一个新的对象。对于非共享的对象如线条客户端直接实例化而不通过享元工厂。
总结
享元模式通过共享对象的方式有效减少了内存使用尤其适用于对象数量庞大且状态相似的场景。JDK中也有享元模式的应用感兴趣的同学可以往这看----JDK享元模式的运用