享元模式 rust和java的实现

Java状态模式解析:智能家居与订单系统实战 状态模式是面向对象设计中处理对象行为随状态变化的经典模式,其核心原理是将状态抽象为独立对象,通过委托机制消除复杂的条件判断。这种设计在Java线程生命周期、Spring状态机等底层架构中广泛应用,能显著提升代码的可维护性和扩展性。从技术实现看,状态模式通过多态机制实现行为动态绑定,每个状态类封装特定行为逻辑,上下文对象只需维护当前状态引用。在智能家居控制、电商订单系统等场景中,该模式能优雅处理复杂状态流转,避免if-else嵌套带来的维护难题。结合享元模式优化后,还可实现状态对象复用,特别适合高并发的订单处 阅读详情

享元模式

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式,可使我们能够重复利用对象,使我们减少重复创建和销毁对象造成的开销,从而提升程序的运行效率。

享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象。

介绍

  • 意图:运用共享技术有效地支持大量细粒度的对象。

  • 主要解决:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。

  • 何时使用:

  1. 系统中有大量重可复利用的对象。
  2. 这些对象消耗大量内。
  3. 对象的创建和销毁较为浪费系统资源。
  4. 这些对象的状态大部分可以外部化。
  5. 这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。
  6. 系统不依赖于这些对象身份,这些对象是不可分辨的。
  • 应用实例: 1、JAVA 中的 String,如果有则返回,如果没有则创建一个字符串保存在字符串缓存池里面。 2、数据库的连接池。

  • 优点:大大减少对象的创建,降低系统的内存,使效率提高。

  • 缺点:提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。

实现

我们将创建一个 Shape 接口和实现了 Shape 接口的实体类 Circle。下一步是定义工厂类 ShapeFactory。

ShapeFactory 有一个 Circle 的 HashMap,其中键名为 Circle 对象的颜色。无论何时接收到请求,都会创建一个特定颜色的圆。ShapeFactory 检查它的 HashMap 中的 circle 对象,如果找到 Circle 对象,则返回该对象,否则将创建一个存储在 hashmap 中以备后续使用的新对象,并把该对象返回到客户端。

FlyWeightPatternDemo 类使用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息(red / green / blue/ black / white),以便获取它所需对象的颜色。

享元模式的 UML 图
在这里插入图片描述

java

步骤 1
创建一个接口。

Shape.java

public interface Shape {
   void draw();
}

步骤 2
创建实现接口的实体类。

Circle.java

public class Circle implements Shape {
   private String color;
   private int x;
   private int y;
   private int radius;
 
   public Circle(String color){
      this.color = color;     
   }
 
   public void setX(int x) {
      this.x = x;
   }
 
   public void setY(int y) {
      this.y = y;
   }
 
   public void setRadius(int radius) {
      this.radius = radius;
   }
 
   @Override
   public void draw() {
      System.out.println("Circle: Draw() [Color : " + color 
         +", x : " + x +", y :" + y +", radius :" + radius);
   }
}

步骤 3
创建一个工厂,生成基于给定信息的实体类的对象,我梦采用hashmap结构存储我们的数据。

ShapeFactory.java

import java.util.HashMap;
 
public class ShapeFactory {
   private static final HashMap<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 circle of color : " + color);
      }
      return circle;
   }
}

步骤 4
使用该工厂,通过传递颜色信息来获取实体类的对象,并且我们是通过颜色判断,是否是需要同一个对象。

FlyweightPatternDemo.java

public class FlyweightPatternDemo {
   private static final String colors[] = 
      { "Red", "Green", "Blue", "White", "Black" };
   public static void main(String[] args) {
 
      for(int i=0; i < 20; ++i) {
         Circle circle = 
            (Circle)ShapeFactory.getCircle(getRandomColor());
         circle.setX(getRandomX());
         circle.setY(getRandomY());
         circle.setRadius(100);
         circle.draw();
      }
   }
   private static String getRandomColor() {
      return colors[(int)(Math.random()*colors.length)];
   }
   private static int getRandomX() {
      return (int)(Math.random()*100 );
   }
   private static int getRandomY() {
      return (int)(Math.random()*100);
   }
}

步骤 5
执行程序,输出结果:

Creating circle of color : Black
Circle: Draw() [Color : Black, x : 36, y :71, radius :100
Creating circle of color : Green
Circle: Draw() [Color : Green, x : 27, y :27, radius :100
Creating circle of color : White
Circle: Draw() [Color : White, x : 64, y :10, radius :100
Creating circle of color : Red
Circle: Draw() [Color : Red, x : 15, y :44, radius :100
Circle: Draw() [Color : Green, x : 19, y :10, radius :100
Circle: Draw() [Color : Green, x : 94, y :32, radius :100
Circle: Draw() [Color : White, x : 69, y :98, radius :100
Creating circle of color : Blue

rust

rust和java的实现相似,就不再赘述过程,不过需要注意的是,在rust中官方没有提供rand包我们需要引入第三方包,所以我们需要在Cargo.toml文件引入以下依赖

[dependencies]
rand = "0.8.5"
实现代码
use std::{collections::HashMap};
use rand::{Rng};
// 创建形状接口
trait Shape {
    fn draw(&self);
}
struct Circle{
    color:String,
    x:i32,
    y:i32,
    radius:i32,
}
impl Shape for Circle {
    fn draw(&self) {
        println!("Circle: Draw() [Color: {},x: {},y: {},radius: {}]",self.color,self.x,self.y,self.radius);
    }
}
impl Circle {
    fn new(color:String)->Circle {
        Circle{
            color:color,
            x:0,
            y:0,
            radius:0
        }
    }
}
// 设置形状工场,进行管理
struct ShapeFactory{
    circle_map:HashMap<String,Circle>
} 
impl ShapeFactory {
    fn get_circle(&mut self,color:&str)->&mut Circle{

        match self.circle_map.get(color) {
            None=>{
                self.circle_map.insert(color.to_owned(),Circle::new(color.to_owned()));  
                println!("Creating circle of color : {}" ,color);
            }
            Some(_)=>{
                println!("已有触发享元")
            }
        };
        self.circle_map.get_mut(color).unwrap()
    }
}
fn get_rand_color()->& 'static str {
    COLORS[rand::thread_rng().gen_range(0..COLORS.len())]
}
fn get_randx()->i32 {
    rand::thread_rng().gen_range(0..100)
}
fn get_randy()->i32 {
    rand::thread_rng().gen_range(0..100)
}
const  COLORS: [&str; 5]=["Red", "Green", "Blue", "White", "Black" ];

fn main() {
  
    let  mut shape_factory=ShapeFactory{circle_map:HashMap::new()};
    for _x in 1..=5 {
        let  color=shape_factory.get_circle(get_rand_color());
        color.x=get_randx();
        color.y=get_randy();
        color.radius=100;
        color.draw();
    }
    // println!("{}",get_rand_color());
        
    

}

rust仓库

rust仓库

https://github.com/onenewcode/design.git
本教程项目在bin文件夹下的flyweight.rs文件中

【信息科学与工程学】计算机科学与自动化——第一百六十八篇 软件设计方法/模式06 编号软件类型设计方法/模式所属层解决的核心问题典型实现适用场景优点风险/注意2701数据治理主数据管理 (Master Data Management, MDM)数据治理层统一管理企业核心业务实体的单一可信版本实践:建立MDM平台,整合来自多个系统的客户、产品、供应商等主数据,通过匹配、合并、去重生成黄金记录。大型企业多系统环境。① 数据一致性;② 提升业务效率;③ 支撑分析。① 实施周期长;② 组织协调难;③ 数据质量要求高。2702数据治理主数据治理委员会 (MDM Governance Board)数 阅读详情

相关推荐

基于深度学习方法(7种)的高光谱与多光谱图像融合(附代码+3个数据集获取)

其他不懂的可以把代码发给AI哦,让它给你解读。

热爱分享,热爱记录 1298

享元模式介绍

享元模式摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,从而让我们能在有限的内存容量中载入更多对象。享元模式要解决的核心问题就是节约内存空间,使用的办法是找出相似对象之间的共有特征,然后复用这些特征。所谓“享元”,顾名思义就是被共享的单元。今天我们就来学习下享元模式。

qq_25409421的博客 1718

Cadence数模混合仿真实战:从Verilog到ADE L的完整流程解析

本文详细解析了Cadence数模混合仿真的完整流程,从Verilog代码编写到ADE L仿真环境配置。通过实战案例讲解如何创建Config文件、搭建混合信号原理图,并分享提高仿真效率的技巧和常见问题排查方法,帮助工程师掌握这一关键芯片设计验证技术。

weixin_29246195的博客 988

设计模式——享元模式原理及代码实现

一、简介 享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。 二、结构图 三、

张先生和他的金毛的博客 307

手把手教你用DCA1000EVM解析IWR6843毫米波雷达数据(附MATLAB代码)

本文提供了一份详尽的实战指南,手把手教你使用DCA1000EVM采集并解析TI毫米波雷达IWR6843的原始数据。内容涵盖硬件连接配置、mmWave Studio参数设置、LVDS数据流结构解析,并附有核心MATLAB代码,详细演示了从原始二进制文件到距离-速度谱的信号处理全链路,帮助开发者快速掌握数据解析与处理的关键步骤。

terraform7cloud的博客 228

从零到一:STM32G431的DSP库集成与FFT实战避坑指南

本文详细介绍了在STM32G431微控制器上集成CMSIS-DSP库并进行FFT实战开发的完整流程。重点解析了通过CubeMX和Keil环境配置DSP库的关键步骤、编译器宏定义陷阱及解决方案,并提供了FFT算法优化、内存管理及常见问题诊断的实用技巧,帮助开发者高效实现嵌入式信号处理应用。

oauth7security的博客 771

享元模式

概述 定义: 运用共享技术来有效地支持大量细粒度对象的复用。 它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。 结构 享元(Flyweight )模式中存在以下两种状态: 内部状态,即不会随着环境的改变而改变的可共享部分。 外部状态,指随环境改变而改变的不可以共享的部分。享元模式的实现要领就是区分应用中的这两种状态,并将外部状态外部化。 享元模式的主要有以下角色: 抽象享元角色(Flyweight):通常是一个接口或抽象类,在抽.

qq_39368007的博客 301

使用Kettle进行数据同步(增量)

文章目录kettle介绍kettle安装kettle使用使用kettle同步关系型数据库数据(MySQL示例)1. 创建一个转换2. 选择表输入3. 格式转换4. 执行脚本5. 创建job使用kettle同步NoSql数据(MongoDB示例)创建转换时的注意事项MongoDBInput怎么创建job的创建如何在Linux上面运行已经创建好的job?1、把创建好的job传输到Linux机器上面2、编辑kjb文件3、执行任务 kettle介绍 Kettle 是一款国外开源的 ETL 工具,纯 Java 编写

JenKin的博客 7351

设计模式——享元模式(附代码示例)

一. 传统方式 以网站项目展示为例,有的要求以新闻形式发布,有的要求以博客形式发布,有的要求以微信公众号形式发布 1. 传统方式解决 给每个网站租用一个空间,直接复制粘贴一份,然后根据客户不同要求,进行定制修改 2. 传统方式存在问题 需要的网站结构相似度很高,而且都不是高访问量网站,如果分成多个虚拟空间来处理,相当于一个相同网站的实例对象很多,造成服务器的资源浪费 3. 解决思路 整合到一个网站中,共享其相关的代码和数据,对于硬...

枫陵的博客 3142

工业相机通用SDK封装实战:C#硬件抽象层(HAL)实现多品牌无缝切换

本文介绍了一种解决工业相机SDK碎片化问题的通用解决方案。作者基于多年工业视觉项目经验,提出通过硬件抽象层(HAL)和适配器模式封装不同品牌相机的SDK差异,实现统一的相机操作接口。文章详细分析了传统直接对接SDK方式的四大痛点:接口碎片化、维护成本高、业务耦合度高和稳定性差,并给出了分层架构设计方案。该方案采用三层架构(业务层、抽象层、实现层),遵循最小接口原则和高内聚低耦合等设计理念,定义了包括触发模式、像素格式等通用枚举类型,以及图像数据结构等核心抽象。最终实现的HAL层能够支持多种品牌相机,显著降低

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 578

ESP32设备驱动-VCNL4040趋近传感器

VCNL4040 将趋近传感器 (PS)、环境光传感器 (ALS) 和高功率 IRED 集成到一个小型封装中。它通过CMOS工艺将光电二极管、放大器和模数转换电路集成到一个芯片中。

视觉与物联智能 942

结构性设计模式(六)享元模式【Java Integer、String 中的应用】

减少运行时对象实例的个数,节省内存 目录一、享元模式的原理与实现1.1 原理1.2 实现二、享元模式的应用举例2.1 QQ象棋2.2 文本编辑器三、享元模式 vs 单例、缓存、对象池三、Java Integer、String 中的应用 一、享元模式的原理与实现 1.1 原理 享元”,顾名思义就是被共享的单元。享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象。 具体来讲,当一个系统中存在大量重复对象的时候,我们就可以利用享元模式,将对象设计成享元,在内存中只保留一份实例,供多处代码引用,这样.

坚持、死磕、重复 690

飞牛fnNAS搭建私有云音乐库

本文介绍了在飞牛NAS上部署Navidrome音乐服务器的完整流程。首先创建音乐存储目录并安装Navidrome应用,然后配置管理员账号、语言设置和音乐路径。接着详细说明使用"音乐标签"软件刮削音乐元数据的方法,包括获取软件、导入音乐文件和自动匹配标签。针对远程访问需求,推荐使用ZeroTier实现内网穿透,并给出注册、创建网络及设备加入的具体步骤。最后介绍移动端使用"音流"APP连接Navidrome服务器的配置方法,实现手机端音乐播放。通过这套方案,用户可以搭建专

dgnankai的专栏 1827

Java面向对象编程:Point类设计与封装实践

面向对象编程(OOP)中的封装性是构建健壮软件系统的核心原则,通过私有成员(private)和访问控制实现数据保护。在Java开发中,Point类的设计完美诠释了这一理念,使用getter/setter方法控制坐标访问,既能防止非法赋值又能添加业务逻辑校验。这种设计模式在图形计算、游戏开发和GIS地理信息系统中广泛应用,特别是需要精确坐标管理的场景。现代IDE如IntelliJ IDEA和Eclipse都提供快速生成get/set方法的支持,结合建造者模式、享元模式等设计模式,可以进一步提升代码的可维护性和

weixin_33946605的博客 373

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

应用程序开发模式 - 结构型模式:对象怎么组

概要:创建型模式解决的是"对象怎么造",那么结构型模式解决的就是"对象怎么组"。在软件系统中,个体对象的设计固然重要,但对象之间的结构关系决定了系统的整体架构质量。一个由设计良好的对象通过糟糕的结构关系组装起来的系统,其可维护性不会比一个由粗糙对象通过合理结构组装的系统更好。 结构型模式的本质是**接口适配与职责转嫁**。

lza_csdn2019的博客 342

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

构建个人代码合集:从效率工具到技术沉淀的实践指南

在软件开发领域,代码复用和知识管理是提升工程效率的核心实践。其基本原理在于通过积累和整理经过验证的代码片段、工具类及解决方案,构建一个可快速检索和复用的个人知识库。这一实践的技术价值在于,它能显著减少重复劳动,避免重复踩坑,并促进开发者对技术原理的深度理解和结构化思考。从应用场景来看,无论是快速实现通用功能(如日期处理、文件操作),还是应对复杂的性能优化与线上问题排查,一个组织良好的代码合集都能成为高效的“加速器”和“避坑指南”。本文以“刘二老师的代码合集”为例,深入探讨了如何通过场景驱动和技术栈隔离的分类

congjukun0600的博客 421

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

享元模式简单实现

享元模式: 解:就是第一个创建的对象,后再次需要使用该对象时,就不需要创建了,直接只用就可以了。 我的理解:批量的单实例。 这个模式的价值分析起来比较复杂,我就不做太多说明了,我的原则是,你如果真的凭你的项目经验能够深刻的理解这种模式的价值,那么你就能很快的理解,如果不是这样我这里讲再多,你理解起来仍然不是很清楚,很可能会另你更糊涂。(我期初看了很多文章,都是这感觉) 如下是抄袭来的(有兴趣的就看...

xie__jin__cheng的博客 492

享元模式的Java实现

享元模式简述: 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 场景:内存属于稀缺资源,不要随意浪费,如果有多个完全相同或相似的对象,我们可以通过享元模式,节省内存 核心:享元模式以共享的方式高效的支持大量细粒度对象的重用 享元对象能做到共享的关键是区分了内部状态和外部状态 内部状态:可以共享,不会随环境变化而改变 外部状态:不可以共享,会...

Young's Blog 629

享元模式 设计模式 Java 实现

** 享元模式 设计模式 Java 实现 **

炫的博客 374

享元模式详解 (附java语言源码)

享元模式(Flyweight Pattern): 运用共享技术有效地支持大量细粒度的对象。(Use sharing to support large numbers offine-grained objects efficiently.) 享元模式核心: 享元模式以共享的方式高效地支持大量细粒度对象的重用。 享元对象能做到共享的关键是区分了内部状态和外部状态。 • 内部状态:可以共享,不会随...

数据知道的博客 2万+

设计模式之:享元模式FlyweightPattern的实现

Python微信订餐小程序课程视频 https://edu.youkuaiyun.com/course/detail/36074 Python实战量化交易理财系统 https://edu.youkuaiyun.com/course/detail/35475 享元模式的理解: 享元模式的定义:运用共享技术支持大量细粒度对象的复用; Flyweight Pattern Definition:Use sharing to support large numbers of fine-grained efficiently. 享元模式关键词

xuhss_com的博客 4450

【设计模式】享元模式(C#)

C#实现享元模式

baidu_33146219的博客 1万+

结构型模式—享元(flyweight)模式

运用共享技术有效支持大量细粒度的对象。

u010378559的博客 348

组网第63课:安全域划分——Trust/Untrust/DMZ、区域模型、与 VLAN 的关系

一组接口 + 一组策略 + 一条默认拒绝。一组接口:这个域包含哪些物理口、VLAN、子接口;一组策略:这个域到别的域放行什么、拒绝什么;一条默认拒绝:没写进策略的,一律不通。第三条最关键。没有默认拒绝,前面划的域全是装饰。

qq_36765170的博客 542

rust: Fan-out/Fan-in Pattern

本项目基于Rust实现珠宝行业全流程的扇出/扇入模式,采用DDD六层架构。通过ProcessRequestDto与ProcessResponseDto传输数据,将采购、设计、生产等12个业务阶段抽象为可并行执行的FanoutTask子任务。核心由JewelryFanoutFanin实现并行调度:先扇出至12个线程并发执行,再统一扇入汇总结果。系统集成日志(文件+控制台)、重试熔断、内存仓储及依赖注入容器,支持顺序与并发两种调度方式,确保高并发下任务可靠执行与可观测性。

Geovin Du Dream Park 148

Rust组织管理(AI回答)

你想做的事JS / Python 做法Rust 做法把一个文件纳入工程新建文件即可新建 xxx.rs 后,必须在入口写mod xxx;挂载对外暴露函数/结构体export(Python 默认全公开)默认全私有,必须显式加pub引入别处的函数use crate::模块名::函数名;找路径的基准词./ 或 ../(从 src 根出发)、(上一级 ../)、(当前级 ./)日常写项目:不要用 #[path],直接遵守默认规则——

yaoct的博客 139
上一篇: 装饰模式 rust和java的实现
下一篇: 黑马点评笔记 redis实现缓存
过去日记
过去日记 新星创作者: 后端开发技术领域 新星创作者: 后端开发技术领域
博客等级 码龄3年 5343粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

过去日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值