Java模式研究袖珍版之Flyweight模式-Java基础-Java-编程开发

即插即用系列(代码实践) | CVPR 2025 WPFormer:小波与原型增强Transformer——表面缺陷检测SOTA,专治弱缺陷与杂乱背景 摘要:本文提出了一种基于小波变换和原型增强的Transformer模型(WPFormer),用于像素级表面缺陷检测。该模型针对工业场景中微弱缺陷难以识别和杂乱背景干扰严重的问题,创新性地将小波变换引入Transformer的注意力机制,通过频域信息分离噪声与边缘特征,同时利用原型向量引导查询,实现了更精准的缺陷定位。核心模块包括小波增强交叉注意力(WCA)和原型引导交叉注意力(PCA),适用于工业缺陷检测、伪装目标检测和医学图像分割等任务。代码已开源,支持即插即用集成到现有框架中。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

  Flyweight定义:

  避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类).

  为什么使用?

  面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可能显得很庞大,比如,字处理软件,如果以每个文字都作为一个对象,几千个字,对象数就是几千,无疑耗费内存,那么我们还是要"求同存异",找出这些对象群的共同点,设计一个元类,封装可以被共享的类,另外,还有一些特性是取决于应用(context),是不可共享的,这也Flyweight中两个重要概念内部状态intrinsic和外部状态extrinsic之分.
  说白点,就是先捏一个的原始模型,然后随着不同场合和环境,再产生各具特征的具体模型,很显然,在这里需要产生不同的新对象,所以Flyweight模式中常出现Factory模式.Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个Flyweight pool(模式池)来存放内部状态的对象.

  Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度.应用场合很多:比如你要从一个数据库中读取一系列字符串,这些字符串中有许多是重复的,那么我们可以将这些字符串储存在Flyweight池(pool)中.

  如何使用?

  我们先从Flyweight抽象接口开始:

  程序代码:

public interface Flyweight
{
  public void operation( ExtrinsicState state );
}
//用于本模式的抽象数据类型(自行设计)
public interface ExtrinsicState { }

  下面是接口的具体实现(ConcreteFlyweight) ,并为内部状态增加内存空间, ConcreteFlyweight必须是可共享的,它保存的任何状态都必须是内部(intrinsic),也就是说,ConcreteFlyweight必须和它的应用环境场合无关.

  程序代码: 

public class ConcreteFlyweight implements Flyweight {
  private IntrinsicState state;
  
  public void operation( ExtrinsicState state )
  {
      //具体操作
  }
}

  当然,并不是所有的Flyweight具体实现子类都需要被共享的,所以还有另外一种不共享的ConcreteFlyweight:
  程序代码: 

public class UnsharedConcreteFlyweight implements Flyweight {
  public void operation( ExtrinsicState state ) { }
}

  Flyweight factory负责维护一个Flyweight池(存放内部状态),当客户端请求一个共享Flyweight时,这个factory首先搜索池中是否已经有可适用的,如果有,factory只是简单返回送出这个对象,否则,创建一个新的对象,加入到池中,再返回送出这个对象.池

  程序代码:

public class FlyweightFactory {
  //Flyweight pool
  private Hashtable flyweights = new Hashtable();
  public Flyweight getFlyweight( Object key ) {
    Flyweight flyweight = (Flyweight) flyweights.get(key);
    if( flyweight == null ) {
      //产生新的ConcreteFlyweight
      flyweight = new ConcreteFlyweight();
      flyweights.put( key, flyweight );
    }
    return flyweight;
  }
}

  至此,Flyweight模式的基本框架已经就绪,我们看看如何调用:

  程序代码:

  FlyweightFactory factory = new FlyweightFactory();
Flyweight fly1 = factory.getFlyweight( "Fred" );
Flyweight fly2 = factory.getFlyweight( "Wilma" );
......

  从调用上看,好象是个纯粹的Factory使用,但奥妙就在于Factory的内部设计上.

  Flyweight模式在XML等数据源中应用

  我们上面已经提到,当大量从数据源中读取字符串,其中肯定有重复的,那么我们使用Flyweight模式可以提高效率,以唱片CD为例,在一个XML文件中,存放了多个CD的资料.

  每个CD有三个字段:

  1.出片日期(year)

  2.歌唱者姓名等信息(artist)

  3.唱片曲目 (title)

  其中,歌唱者姓名有可能重复,也就是说,可能有同一个演唱者的多个不同时期 不同曲目的CD.我们将"歌唱者姓名"作为可共享的ConcreteFlyweight.其他两个字段作为UnsharedConcreteFlyweight.

  首先看看数据源XML文件的内容:

  程序代码:

<collection>

 <cd>
  <title>Another Green World</title>
  <year>1978</year>
  <artist>Eno, Brian</artist>
 </cd>

 <cd>
  <title>Greatest Hits</title>
  <year>1950</year>
  <artist>Holiday, Billie</artist>
 </cd>

 <cd>
  <title>Taking Tiger Mountain (by strategy)</title>
  <year>1977</year>
  <artist>Eno, Brian</artist>
 </cd>
 .......
</collection>

  虽然上面举例CD只有3张,CD可看成是大量重复的小类,因为其中成分只有三个字段,而且有重复的(歌唱者姓名).

  CD就是类似上面接口 Flyweight:

  程序代码:

public class CD {

  private String title;
  private int year;
  private Artist artist;

  public String getTitle() {  return title; }
  public int getYear() {    return year;  }
  public Artist getArtist() {    return artist;  }

  public void setTitle(String t){    title = t;}
  public void setYear(int y){year = y;}
  public void setArtist(Artist a){artist = a;}

}

  将"歌唱者姓名"作为可共享的ConcreteFlyweight:

  程序代码:

public class Artist {
  //内部状态
  private String name;
  // note that Artist is immutable.
  String getName(){return name;}
  Artist(String n){
    name = n;
  }
}

  再看看Flyweight factory,专门用来制造上面的可共享的ConcreteFlyweight:Artist

  程序代码:

public class ArtistFactory {
  Hashtable pool = new Hashtable();
  Artist getArtist(String key){
    Artist result;
    result = (Artist)pool.get(key);
    ////产生新的Artist
    if(result == null) {
      result = new Artist(key);
      pool.put(key,result);
      
    }
    return result;
  }
}

  当你有几千张甚至更多CD时,Flyweight模式将节省更多空间,共享的flyweight越多,空间节省也就越大.

LeRobot — 基于 PyTorch 的真实世界机器人学习框架(一)- 核心框架模块解析 LeRobot 是一个开源的机器人学习框架,由 Hugging Face 开发,旨在降低机器人学的准入门槛。该框架提供完整的机器学习流程支持,包括数据采集、训练、评估和部署。核心模块涵盖数据集标准化、策略算法、硬件抽象和强化学习组件,采用模块化设计实现灵活扩展。通过集成 Hugging Face Hub,用户可以轻松共享数据集和预训练模型。LeRobot 特别注重真实世界的机器人应用,支持多种前沿算法如模仿学习、视觉语言动作模型等,并提供统一的硬件接口和仿真环境适配。 阅读详情

相关推荐

基于TL431与MOSFET的高效过压保护电路设计详解

本文详细解析了基于TL431与MOSFET的高效过压保护电路设计。通过TL431精准监测电压,驱动MOSFET作为主开关,实现快速可靠的电源保护。文章涵盖电路原理、参数计算、性能优化及实战调试要点,为电子设备提供了一套经典且成本低廉的过压保护解决方案。

weixin_29215391的博客 782

结构设计模式 - Flyweight设计模式(享元设计模式)

结构设计模式 -Flyweight设计模式 今天我们将研究Flyweight设计模式,Flyweight设计模式又被称为 享元设计模式 。 目录[隐藏] 1Flyweight设计模式 1.1Flyweight设计模式界面和混凝土类 1.2 轻量级工厂 1.3Flyweight设计模式客户端示例 1.4JDK中的Flyweight设计...

YunWisdom 685

Ubuntu 20.04下IgH EtherCAT主站部署实战

本文详细介绍了在Ubuntu 20.04系统上部署IgH EtherCAT主站的完整流程,包括环境准备、源码编译、内核模块配置、网络接口设置及实时性优化等关键步骤。通过实战案例和常见问题排查,帮助开发者快速掌握EtherCAT主站部署技巧,提升工业自动化系统的稳定性和实时性。

weixin_30596343的博客 1071

Java设计模式研究之Flyweight模式

GOF:运用共享技术有效地支持大量细粒度的对象。   解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。比如说(这里引用GOF书中的例子)一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象。如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了。那么如果要是每个字母都

dac55300424的专栏 441

React 源码解析 | Reconcile协调过程

上篇讲了React的工作流程,这篇详细的讲一下render过程中的beginWork函数,也就是深度优先创建Fiber树中"递"的过程。beginWork函数传入当前已经创建好的Fiber节点,返回创建/复用的第一个子FIber节点,也就是wip.child在renderRoot中,在开始创建整棵FIber树之前,会先调用prepareRefreshStack创建/复用一个新的HostRootFiber。

weixin_40710412的博客 1220

手把手教你用UC3842搭建12V/5A反激电源(附PSIM仿真文件)

本文详细介绍了基于UC3842的12V/5A反激电源设计与PSIM仿真实践。从UC3842芯片选型、高频变压器计算到PSIM仿真模型搭建,提供完整的开关电源设计流程。特别包含PCB布局要点和实测优化建议,帮助工程师快速掌握反激电源开发技巧。

u6v7w8x的博客 1203

2024年Java最全Java设计模式之享元模式(Flyweight Pattern),java集合框架面试题

很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取本文已被。

2401_84557849的博客 1192

Lumerical 教程,包含作者个人理解及相关设计案例 (目前共计184篇,持续更新中)

4138。

u011699626的博客 1630

什么是flyweight(元享)模式

<br />  对于设计模式我一直都在悟,说实在话,设计模式并不能让你的代码越来越简单,反而会让其复杂化,理解设计模式不难,吸收设计模式是痛苦的过程。 <br />  设计模式是实践的产物,有需求才有改进,是一种聪明的偷懒方法,gof的设计模式比较抽象化,看看就知道是博士创作出来的东西,高度抽象形成理论,而理论是比较难于理解的,今天我斗胆也来谈谈对设计模式的一点感悟,说实话,现阶段我对设计模式的理解和吸收还在一个比较初级的阶段,所以我开篇说了“悟”,所以有什么说的不对,写的不好的地方还需要各位朋友的支持和改

legendmoheNote的专栏 1163

华为OD新系统机试真题-文章特征提取

华为OD机试新系统真题 【文章特征提取】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统机试真题【文章特征提取】

qq_45776114的博客 733

AIGC实战——变分自编码器(Variational Autoencoder, VAE)

变分自编码器通过在模型中引入随机性,并限制潜空间中的点的分布来解决自编码器存在的问题。只需进行一些微小的调整,就可以将自编码器转换为变分自编码器,从而使其成为真正的生成模型。在本节中,我们介绍了变分自编码器的基本原理,并使用 `Keras` 实现了一个变分自编码器用于生成 Fashion-MNIST 图像。

盼小辉丶的博客 1万+

导出功能设计模式_功能设计模式,第1部分

关于本系列 本系列旨在将您的观点重新定位为实用的心态,帮助您以新的方式看待常见问题并找到改善日常编码的方式。 它探讨了函数式编程的概念,允许使用Java™语言进行函数式编程的框架,在JVM上运行的函数式编程语言以及语言设计的一些未来方向。 该系列面向那些了解Java及其抽象如何工作,但很少或没有使用功能语言经验的开发人员。 函数世界中的某些人员声称设计模式的概念是有缺陷的,并且在函...

cusi77914的博客 503

【WebRTC】【Unity】Unity Web RTC1-Unity中简单实现远程画面

平台:基本常用平台包括安卓,苹果(max和IOS),Windows64,Linux都行。10. 注意,如果从移动设备浏览器连接服务,信令服务器的SSL证书一定要先设好。想要在Unity中实现实时远程桌面,找到了Render Streaming这个手段,本篇介绍相应的使用方法和实例。8. 打开电脑浏览器,地址栏输入http://127.0.0.1,点击Receiver Sample。新建Unity项目,模板选Third Person,Project Name随意。启动App,控制台出现如下信息表示成功。

每日出拳老爷子的博客 2518

23.共享模式

亨元模式是一种结构型设计模式,它丢弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让我们能在有限的内存容量中载入更多的对象。

c1776167012的博客 1703

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Flyweight(享元)模式

Flyweight模式可实现客户代码之间的对象共享,创建共享对象的职责,这一点普通对象是不具备的。一般的对象不必关心共享职责,任何时刻最多只能有一个客户代码引用它,其他时刻可以是其他客户代码引用。如果多个客户代码引用同一个对象,那么当某个客户代码修改了该对象的状态时,该对象是不会通知其他客户代码的。然而,有时候,我们需要让多个客户代码共享访问同一个对象。     当我们必须管理成千上万个小型对...

何新宇的技术博客 208

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

设计模式学习总结

引子刚开始学习设计模式的时候,感到这些模式真的非常抽象。今年下半年以来,随着我们组工作重点的转移,以及我在小组中角色的变化,我开始有条件提出自己对新系统的设计想法。在设计过程中,我发现了很多设计模式的用处,也确实应用了很多设计模式,这让我越来越感到设计模式的重要性,因此我写了这十余篇专门介绍设计模式的文章,作为我的学习笔记。《设计模式——可复用的面向对象软件的基础》(有趣的是,梅宏一再在组

山里娃的专栏 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

java的JDK中包含哪些设计模式

在JDK(Java Development Kit)类库中,开发人员使用了大量设计模式,正因为如此,我们可以在不修改JDK源码的前提下开发出自己的应用软件,本文列出了部分JDK中的模式应用实例,有兴趣的童鞋可以深入研究,看看前Sun公司的开发人员是如何在实际框架开发中运用设计模式的,,Sunny认为,研究JDK类库中的模式实例也不失为学习如何使用设计模式的一个好方式,。 创建型模式: (1

不一样的技术人 1834

枚举重名_举重设计模式示例

枚举重名 本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 1.节拍模式 2.什么是轻量级模式 3.解决问题 4.何时使用节拍模式 5. JDK中的Flyweight 6.下载源...

最佳 Java 编程 323

GOF 23种设计模式(Patterns in Java)

板桥里人的设计模式讲解是国内媒体(包括书籍和网站)中最早的成体系介绍,本系列介绍纯为免费传播(转载本站文章,请保留作者和网址),尽量做到言简意赅,通俗易懂,但是难免有所疏漏敬请来信或论坛讨论,不断完善。   真正掌握设计模式需要在实践中不断研究和使用,关于设计模式在具体实例的应用,可以阅读板桥里人的书籍《Java实用系统开发指南》。书籍中8个实例都从设计模式、框架等高度对系统进行崭新的设计和实现,

phphot 1811

关于享元模式

这一周都是面试。昨天被问起设计模式,好久没去研究这方面了,我回忆着之前在《js设计模式》上看到的东西说了下自己对原型模式、工厂模式和享元模式的理解,一开始hr还点了点头,然后指出我对享元模式的理解不到位。然后开始说他的看法。我最喜欢面试的时候这种交流,不是提醒自己忘记的东西,就是通过别人的认识去理解某些事物。一开始我还挺听得懂,后来他说享元模式在某种意义上就是单例模式+工厂模式的结合时,我就有点迷...

weixin_36094484的博客 1049

系统研究Java--容器(二)--使用Abstract类

这个示例在于演示通过继承java.util.Abstract来创建定制的Map和Collection,实现一个只读的Map。 //: net/mindview/util/Countries.java // "Flyweight" Maps and Lists of sample data. package net.mindview.util; import java.util.*; im...

neu_swc的专栏 147

java 开发模式之十八 :蝇量模式(享元模式)

原理或定義 能做到共享的关键是区分内蕴状态(Internal State)和外蕴状态(External State). 一个内蕴状态是存储在享元对象内部的,并且不会随环境改变而有所不同.因此,一个享元可以具有内蕴状态并可以共享 .一个外蕴状态是随环境改变而改变的,不可以共享状态.享元对象的外蕴状态必须由客户端保存, 并在享元对象被创建之后, 在需要使用的时候再传到享元对象内部. 单纯享元模式

MoShimWang的博客 451

JDK中的设计模式应用实例

在JDK(Java Development Kit)类库中,开发人员使用了大量设计模式,正因为如此,我们可以在不修改JDK源码的前提下开发出自己的应用软件,本文列出了部分JDK中的模式应用实例,有兴趣的童鞋可以深入研究,看看前Sun公司的开发人员是如何在实际框架开发中运用设计模式的,,Sunny认为,研究JDK类库中的模式实例也不失为学习如何使用设计模式的一个好方式,。   创建型模式

ystyaoshengting的专栏 1181
上一篇: java实现屏幕取色-Java基础-Java-编程开发
下一篇: 利用Java技术开发Web网络课件浅议-Java基础-Java-编程开发
java169
博客等级 码龄18年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值