深度学习设计模式之享元设计模式

news2024/11/16 1:26:59

文章目录

  • 前言
  • 一、介绍
  • 二、特点
  • 三、详细介绍
    • 1.核心组成
    • 2.代码示例
    • 3.优缺点
      • 优点
      • 缺点
    • 4.使用场景
  • 总结


前言

享元设计模式主要用于减少创建对象的数量,以减少内存占用,提高性能。


一、介绍

享元设计模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享来高效地管理大量拥有相同或相似状态的小对象。这种模式可以减少内存使用并提高性能,特别是在处理大量相似对象时。

二、特点

  • 共享对象:享元模式通过共享多个相似对象来减少内存占用。

  • 内部与外部状态:享元对象将状态分为内部状态和外部状态。内部状态是共享的,而外部状态是特定的,不共享。

  • 细粒度控制:享元模式允许对对象进行更细粒度的控制,通过组合内部和外部状态来创建不同的对象。

  • 享元工厂:享元模式通常包含一个享元工厂(Flyweight Factory),用于创建和管理享元对象。

  • 不变性:享元对象的内部状态应该是不可变的,以确保共享的安全性。

三、详细介绍

1.核心组成

  • 抽象享元角色:为具体享元角色规定了必须实现的方 法,而外部状态就是以参数的形式通过此方法传入。
  • 具体享元角色:实现抽象角色规定的方法。如果存在内部状态,就负责为内部状态提供存储空间。
  • 享元工厂角色:负责创建和管理理享元角色。要想达到共 享的目的,这个角色的实现是关键。
    在这里插入图片描述

2.代码示例

抽象享元对象

/**
 * 抽象享元对象
 */
public abstract class FilmFlyweight {

    /**
     * 播放电影
     */
    public abstract void play(FilmInfo filmInfo);

}

具体享元对象

/**
 * 具体享元对象
 */
public class FilmFlyweightImpl extends FilmFlyweight{

    /**
     * 内部状态
     */
    private String category;

    public FilmFlyweightImpl(String category) {
        this.category = category;
    }

    @Override
    public void play(FilmInfo filmInfo) {
        System.out.println("电影名称为:"+filmInfo.getName()+" 电影类别为:"+category);
    }
}

外部对象

/**
 * 电影类
 */
public class FilmInfo {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public FilmInfo(String name) {
        this.name = name;
    }
}

享元工厂对象

/**
 * 享元工厂对象
 */
public class FilmFactory {

    private HashMap<String,FilmFlyweight> factory = new HashMap<String,FilmFlyweight>();


    /**
     * 获取享元对象
     * @param key
     * @return
     */
    public FilmFlyweight getFilmFlyweightByKey(String key){
        if(factory.containsKey(key)){
            return factory.get(key);
        }else {
            FilmFlyweightImpl filmFlyweight = new FilmFlyweightImpl(key);
            factory.put(key,filmFlyweight);
            return filmFlyweight;
        }
    }

    public int getNumber(){
        return factory.size();
    }

}

测试类

/**
 * 测试类
 */
public class FlyweightTest {

    public static void main(String[] args) {

        FilmFactory factory = new FilmFactory();
        FilmFlyweight flyweight1 = factory.getFilmFlyweightByKey("冒险");
        flyweight1.play(new FilmInfo("勇敢者的游戏"));


        FilmFlyweight flyweight2 = factory.getFilmFlyweightByKey("科幻");
        flyweight2.play(new FilmInfo("三体"));

        FilmFlyweight flyweight3 = factory.getFilmFlyweightByKey("科幻");
        flyweight3.play(new FilmInfo("流浪地球"));

        System.out.println("总条数为:"+factory.getNumber());

    }

}

结果
在这里插入图片描述

3.优缺点

优点

  • 大大减少了对象的创建,降低了程序内存的占用,提高效率。

缺点

  • 提高了系统的复杂度,需要分离出内部状态和外部状态

4.使用场景

  1. 当需要管理大量相似或相同的对象时,享元模式可以显著减少内存消耗。
  2. 如果对象的存储成本很高,使用享元模式可以节省资源。
  3. 当对象的大部分状态可以外部化时,享元模式可以有效地共享对象。
  4. 当需要避免使用大量细粒度的对象时,可以使用享元模式来优化系统结构。

总结

享元模式在实际开发中非常有用,尤其是在图形界面、游戏开发和办公软件中,它可以帮助我们高效地管理大量相似对象,提高系统的性能和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2058607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c语言练习题1

1.输出Helloword /*输出Helloword*/ #include<stdio.h> int main() {printf("Hello word!");return 0; }2.整型变量的定义与使用 /*整型变量的定义与使用*/ #include <stdio.h> int main() {int a;int b;a 10;b 20;int c a b;int d a - b;printf(…

ETAS工具链自动化实战指南<一>

----自动化不仅是一种技术&#xff0c;更是一种思维方式&#xff0c;它将帮助我们在快节奏的工作环境中保持领先&#xff01; 目录 往期推荐 场景一&#xff1a;SWC 之间 port自动连接 命令示例 参数说明 场景二&#xff1a;SWC与ECU 自动映射 命令示例 参数说明 场景三&…

叉车刷卡系统,IC卡授权驾驶,提高叉车管理效率!

叉车作为仓储物流行业的主力军&#xff0c;长期占据着物流运输的主导地位。但由于厂区内叉车数量庞大&#xff0c;作为重型的特种设备&#xff0c;往往很容易发生碰撞事故。数量庞大且容易发生事故的叉车很难集中管理、叉车运输环境的复杂加之管理员不可能24小时全面监管工作。…

图表数据自动化软件有哪些?图表数据自动化怎么做

在数字化时代&#xff0c;数据的呈现方式越来越多样化&#xff0c;图表成为了表达复杂信息、数据趋势和分析结果的有效工具。然而&#xff0c;随着数据量的激增&#xff0c;手动创建和更新图表变得既耗时又低效。因此&#xff0c;图表数据自动化软件的应用变得尤为重要。这些软…

如何在没有密码的情况下解锁Oppo手机?5 种简单的方法

保护智能手机隐私的一种绝佳方法是设置复杂的锁屏密码或图案。一些OPPO手机的所有者在更改图案或密码后&#xff0c;在一夜之间失去了对其图案或密码的内存。事实上&#xff0c;OPPO用户遇到的众多问题包括忘记密码或锁定屏幕。遗憾的是&#xff0c;没有多少人知道无需密码即可…

在Chrome浏览器中安装JSON显示插件

步骤1&#xff1a; 在浏览器中打开https://github.com&#xff0c;在顶部的搜索栏中输入“chrome json”并开始搜索 输入关键字时&#xff0c;使用浏览器名称与“json”作为关键字&#xff0c;且中间使用空格进行分隔。 步骤2&#xff1a; 在搜索结果中选择第1个项目 在githu…

UE5用蓝图实现物体A始终朝向物体B |Find Look at Rotation|

非常常用的蓝图节点 |Find Look at Rotation|&#xff1a;获取 物体A 到 物体B 的Rotator。 Tick中将算出的Rotator设置给物体A&#xff0c;即可实现永远朝向物体B

IEEE |第五届机器学习与计算机应用国际学术会议(ICMLCA 2024)

第五届机器学习与计算机应用国际学术会议(ICMLCA 2024)定于2024年10月18-20日在中国杭州隆重举行。本届会议将主要关注机器学习和计算机应用面临的新的挑战问题和研究方向&#xff0c;着力反映国际机器学习和计算机应用相关技术研究的最新进展。 IEEE |第五届机器学习与计算机应…

喜报 | IDC中国Fintech50榜单正式发布!

IDC金融行业研究&#xff08;IDC Financial Insights&#xff09;团队以全球视角关注金融科技创新&#xff0c;并对金融科技厂商进行持续追踪。针对技术服务商的能力评估、比较优势分析以及市场份额等方面的研究是其中重要的组成部分。 基于研究报告以及行业用户的调研&#x…

Qt点亮开发板的一个LED-思维导图-学习笔记-基于正点原子阿尔法开发板

Qt点亮开发板的一个LED Qt如何操控开发板上的一个LED Qt与硬件控制的关系 Qt本身并不直接控制开发板上的硬件&#xff0c;而是通过中间层进行交互 驱动层的作用 驱动层是连接Qt应用层和硬件的关键部分&#xff0c;它提供了必要的接口和功能&#xff0c;使得Qt能够通过这些接…

2024局域网管理软件大盘点!哪款局域网软件好用?一文解答不容错过哦!

“不积跬步无以至千里&#xff0c;不积小流无以成江海。”在当今社会&#xff0c;每一项细微的技术进步都在推动着企业向前发展。 对于现代企业而言&#xff0c;高效管理局域网不仅能够提升工作效率&#xff0c;还能保障网络安全。这篇文章小编将为您盘点目前市场上优秀的局域…

星环科技×鼎捷软件强强联手,共建数智制造新引擎

近日&#xff0c;星环科技与鼎捷软件基于雅典娜新型工业互联网平台强强联手&#xff0c;围绕制造业普遍面临的生产计划、过程控制、成本管理等环节存在的经营痛点&#xff0c;以数据为核心打造工业互联网平台&#xff0c;从关键生产流程入手&#xff0c;建立了实时、系统、全面…

SSM老年人活动信息管理系统---附源码121730

目 录 摘要 1 绪论 1.1研究背景 1.2国内外研究现状 1.3系统开发技术的特色 1.4论文结构与章节安排 2 老年人活动信息管理系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.3.2数据修改流程 2.3.3数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 …

vue2表单校验:el-form表单绑定数组并使用rules进行校验

前言 vue项目中&#xff0c;大量使用element ui组件中的el-form来构建丰富且具有交互性的表单页面&#xff08;官网&#xff1a;Element - The worlds most popular Vue UI framework&#xff09;。el-form提供了丰富的表单控件&#xff0c;如输入框、下拉框、日期选择器等&am…

React原理之Fiber双缓冲

前置文章&#xff1a; React原理之 React 整体架构解读React原理之整体渲染流程React原理之Fiber详解 -----读懂这一篇需要对 React 整体架构和渲染流程有大致的概念 &#x1f60a;----- 在前面的文章中&#xff0c;简单介绍了 Fiber 架构&#xff0c;也了解了 Fiber 节点的…

Python功能强大且易于使用的命令行 shell库之xonsh使用详解

概要 Xonsh 是一种基于 Python 的跨平台、用户友好的命令行 shell。它结合了 Python 和传统 shell 命令的优势&#xff0c;允许用户在同一个环境中使用两者。Xonsh 为开发者和系统管理员提供了强大的工具&#xff0c;简化了任务自动化和脚本编写。本文将详细介绍 xonsh 库&…

基于php网上差旅费报销系统设计与实现

网上报销系统以LAMP(LinuxApacheMySQLPHP)作为平台,涉及到PHP语言、MySQL数据库、JavaScript语言、HTML语言。 2.1 PHP语言简介 PHP&#xff0c;一个嵌套的缩写名称&#xff0c;是英文 “超级文本预处理语言”&#xff08;PHP: Hypertext Preprocessor&#xff09;的缩写。P…

又学了几个新的comfyui小技巧,分享给大家!

前言 掌握一些小技巧&#xff0c;提升效率&#xff01; 1、图像选择器 出图批次是四张&#xff0c;然后想选一张图进入到之后的工作流&#xff0c;就可以用这个节点 默认是这样的 运行到这个节点的时候&#xff0c;会出现四张图片&#xff0c;选中满意的图片&#xff0c;点…

RM惯性测量单元IMU

在Robomaster比赛中&#xff0c;一般各大参赛队会在机器人的云台上搭载IMU&#xff0c;用以反馈云台的yaw轴和pitch轴的角度和角速度。 需要注意的是&#xff0c;尽管依靠云台电机6020的编码器同样可以实现以上数据的获取&#xff0c;但是由于云台控制对于灵敏度和精度的要求比…

微信删除的聊天记录怎么恢复?实测有效,3招教您轻松恢复

微信已成为我们传递信息、分享情感的重要桥梁。然而&#xff0c;不小心误删的聊天记录往往让人懊悔不已&#xff0c;尤其是那些珍贵的对话和重要的信息。面对微信删除的聊天记录怎么恢复的问题&#xff0c;很多人都会感到束手无策。 但别担心&#xff0c;无论您是技术小白还是…