当前位置: 首页 > article >正文

结构型模式6.享元模式

结构型模式

  1. 适配器模式(Adapter Pattern)
  2. 桥接模式(Bridge Pattern)
  3. 组合模式(Composite Pattern)
  4. 装饰器模式(Decorator Pattern)
  5. 外观模式(Facade Pattern)
  6. 享元模式(Flyweight Pattern)
  7. 代理模式(Proxy Pattern)

享元模式(Flyweight Pattern)是一种结构型设计模式,用于减少内存占用,特别是在需要创建大量相似对象的场景中。它通过共享对象来减少内存的消耗,避免创建重复的对象。

享元模式的核心思想:

享元模式的核心思想是:

  • 将对象的状态分为共享状态非共享状态
  • 共享状态存储在享元对象中,多个对象可以共享同一个享元对象。
  • 非共享状态由每个具体的对象自己保存,通常是通过外部传入的方式。

享元模式的关键组成部分:

  1. Flyweight(享元接口):定义可以共享的接口。
  2. ConcreteFlyweight(具体享元类):实现共享状态。
  3. FlyweightFactory(享元工厂类):管理享元对象的创建和共享,确保多个对象共享相同的享元。
  4. UnsharedConcreteFlyweight(非共享享元类):存储每个对象独有的状态。

享元模式的例子:图形编辑器

我们可以通过一个图形编辑器的例子来说明享元模式。假设我们有一个应用需要大量绘制相同类型的图形(如圆形、方形等),但是每个图形的颜色和位置是不同的。如果每个图形都存储相同的颜色、形状等属性,那么会消耗大量内存。

为了节省内存,我们可以使用享元模式,避免为每个图形重复存储相同的信息,而是共享相同的图形数据。

public interface Shape {
    void draw(String color);  // 绘制图形,color是每个图形的非共享状态
}


public class Circle implements Shape {
    private String shapeType;  // 共享状态:形状类型

    public Circle() {
        this.shapeType = "Circle";  // 所有圆形对象共享同一个类型
    }

    @Override
    public void draw(String color) {
        System.out.println("绘制 " + shapeType + ",颜色: " + color);
    }
}


import java.util.HashMap;
import java.util.Map;

public class ShapeFactory {
    private Map<String, Shape> shapeMap = new HashMap<>();  // 缓存已经创建的享元对象

    public Shape getShape(String shapeType) {
        Shape shape = shapeMap.get(shapeType);  // 如果已经创建过该形状,直接返回
        if (shape == null) {
            if (shapeType.equalsIgnoreCase("Circle")) {
                shape = new Circle();  // 创建一个新的Circle对象
            }
            shapeMap.put(shapeType, shape);  // 缓存新创建的享元对象
        }
        return shape;
    }
}


public class Client {
    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();

        // 创建并绘制不同颜色的圆形
        Shape circle1 = shapeFactory.getShape("Circle");
        circle1.draw("红色");

        Shape circle2 = shapeFactory.getShape("Circle");
        circle2.draw("蓝色");

        Shape circle3 = shapeFactory.getShape("Circle");
        circle3.draw("绿色");

        // 检查是否是同一个Circle对象
        System.out.println(circle1 == circle2);  // 输出:true,说明共享了同一个对象
    }
}

解释:

  • 共享状态:在这个例子中,Circle类的shapeType("Circle")是共享状态,所有的圆形对象都共享同一个Circle对象。
  • 非共享状态:每个draw方法的color参数是非共享状态,每个对象的颜色不同,因此存储在外部传入。
  • 享元工厂(ShapeFactory:负责管理享元对象的创建和共享。它确保相同的形状对象(例如圆形)不会被重复创建,而是通过缓存池重用已创建的对象。
  • 客户端(Client:客户端通过享元工厂获取图形对象,客户端并不关心这些图形是否被共享,只需要关注它们的非共享属性(如颜色)。

优势:

  • 节省内存:通过共享相同的享元对象,可以大大减少内存的使用,特别是在需要创建大量相似对象的场景中。
  • 提高性能:共享对象可以减少对象的创建和销毁,提高性能。
  • 适用于不可变对象:享元模式特别适合用于不可变对象,因为它们的共享状态不能被修改。

劣势:

  • 复杂性增加:引入享元模式后,系统的结构会变得更复杂,需要管理享元对象的创建和缓存。
  • 非共享状态管理:对于每个享元对象的非共享状态,仍然需要额外的管理机制。

总结:

享元模式通过将共享状态提取出来,减少内存消耗,适用于大量相似对象的场景。在设计时需要仔细分离共享和非共享状态,确保享元对象的高效利用。


http://www.kler.cn/a/465778.html

相关文章:

  • 如何通过USB在电脑上查看手机屏幕
  • 【数据结构-堆】力扣2530. 执行 K 次操作后的最大分数
  • SqlSugar-文章目录
  • vue3 vite 动态加载路由遇到的问题
  • 什么情况会导致JVM退出?
  • 通往O1开源之路
  • CameraCtrl: Enabling Camera Control forText-to-Video Generation 论文解读
  • Qemu配置QXL显卡支持分辨率
  • 构建一个简单的Promise
  • LQ24fresh
  • Java项目实战II基于微信小程序的家庭大厨(开发文档+数据库+源码)
  • 经典文献阅读之--Senna(桥接大型视觉语言模型和端到端自动驾驶)
  • el-table动态行和列及多级表头
  • 【每日学点鸿蒙知识】Video播放失败、toggle拖拽、图片裁剪旋转等
  • C语言----函数
  • postgres docker安装
  • 【数据仓库】hadoop3.3.6 安装配置
  • [CTF/网络安全] 攻防世界 command_execution 解题详析
  • df.groupby与apply一起使用,举例项目中实际经常使用的场景
  • 基于SpringBoot的网上订餐系统(源码+数据库+文档)
  • C# _ 数字分隔符的使用
  • 2024年中国航天发射列表(68次发射,失败2次,部分失败1次)
  • python 给钉钉发消息简易demo
  • 带虚继承的类对象模型
  • 关于计算机中上下文概念的理解
  • Mac iTerm2集成DeepSeek AI