您的位置:首页 > 文旅 > 旅游 > 广州海珠区疫情_自己设计手机的网站_大学生创新创业大赛_学seo推广

广州海珠区疫情_自己设计手机的网站_大学生创新创业大赛_学seo推广

2024/12/21 20:01:29 来源:https://blog.csdn.net/qq_35861084/article/details/144006941  浏览:    关键词:广州海珠区疫情_自己设计手机的网站_大学生创新创业大赛_学seo推广
广州海珠区疫情_自己设计手机的网站_大学生创新创业大赛_学seo推广

享元模式 (Flyweight Pattern)

享元模式是一种 结构型设计模式,通过共享相同对象,减少内存使用,提升系统性能。该模式适用于大量相似对象的场景,能有效避免重复创建相同对象。


原理

  1. 核心思想
    • 将对象的 内在状态(不变部分)与 外在状态(可变部分)分离。
    • 对于重复的内在状态,共享同一个对象实例。
  2. 适用场景
    • 有大量相似对象。
    • 内存占用成为性能瓶颈。
  3. 关键点
    • 共享内在状态:对象的不可变部分,可被多个对象共享。
    • 独立外在状态:对象的可变部分,由客户端管理。

优点

  1. 减少内存开销:通过共享对象实例,避免重复创建。
  2. 提升性能:适用于资源紧张的场景。

缺点

  1. 代码复杂性增加:需要分离内外状态,并管理共享池。
  2. 引入管理成本:需要额外的工厂或容器管理共享对象。

示例代码

场景描述

假设一个绘图程序需要绘制大量的圆形,但颜色相同的圆形可以共享对象实例。通过享元模式,我们可以避免为每个圆形重复创建对象。


1. 定义抽象享元类
// 抽象享元类
public interface Shape {void draw(int x, int y, int radius); // 接收外在状态作为参数
}

2. 创建具体享元类
// 具体享元类
public class Circle implements Shape {private String color; // 内在状态public Circle(String color) {this.color = color;}@Overridepublic void draw(int x, int y, int radius) {System.out.println("Drawing Circle [Color: " + color + ", X: " + x + ", Y: " + y + ", Radius: " + radius + "]");}
}

3. 创建享元工厂
import java.util.HashMap;
import java.util.Map;// 享元工厂
public class ShapeFactory {private static final Map<String, Shape> circleMap = new HashMap<>();public static Shape getCircle(String color) {Circle circle = (Circle) circleMap.get(color);if (circle == null) {circle = new Circle(color); // 创建新的享元对象circleMap.put(color, circle);System.out.println("Creating new Circle of color: " + color);}return circle;}
}

4. 客户端代码
public class FlyweightPatternExample {public static void main(String[] args) {Shape circle1 = ShapeFactory.getCircle("Red");circle1.draw(10, 20, 5);Shape circle2 = ShapeFactory.getCircle("Blue");circle2.draw(15, 25, 10);Shape circle3 = ShapeFactory.getCircle("Red"); // 重复颜色,使用共享对象circle3.draw(20, 30, 15);Shape circle4 = ShapeFactory.getCircle("Green");circle4.draw(25, 35, 20);Shape circle5 = ShapeFactory.getCircle("Blue"); // 重复颜色,使用共享对象circle5.draw(30, 40, 25);}
}

输出结果
Creating new Circle of color: Red
Drawing Circle [Color: Red, X: 10, Y: 20, Radius: 5]
Creating new Circle of color: Blue
Drawing Circle [Color: Blue, X: 15, Y: 25, Radius: 10]
Drawing Circle [Color: Red, X: 20, Y: 30, Radius: 15]
Creating new Circle of color: Green
Drawing Circle [Color: Green, X: 25, Y: 35, Radius: 20]
Drawing Circle [Color: Blue, X: 30, Y: 40, Radius: 25]

UML 类图

        +------------------+|    Shape         |+------------------+| + draw(x, y, r)  |+------------------+^|+------------------+|    Circle        |+------------------+| - color          || + draw(x, y, r)  |+------------------++------------------+| ShapeFactory      |+------------------+| - circleMap       || + getCircle(color)|+------------------+

使用场景

  1. 文字处理软件:如字处理程序中相同字符的共享。
  2. 图形系统:共享相同属性的图形对象。
  3. 缓存管理:如线程池、数据库连接池。

小结

  • 享元模式通过共享对象实例,有效降低内存开销,提升性能。
  • 它需要分离对象的内在状态和外在状态,同时通过工厂管理对象的共享。
  • 适用于需要频繁创建大量相似对象的场景,但要注意外在状态的管理复杂性。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com