原型模式 rust和java的实现

用Rust实现23种设计模式之抽象工厂 在上述示例中,我们首先定义了抽象产品族的 trait AbstractProductA 和 AbstractProductB ,分别定义了产品族中的操作方法。然后,我们实现了具体产品族1和具体产品族2,它们分别实现了 AbstractProductA 和 AbstractProductB trait。然后,我们实现了具体工厂1和具体工厂2,它们分别实现了 AbstractFactory trait,并实现了创建具体产品族的方法。 阅读详情

原型模式

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。

这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

介绍

  • 意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
  • 主要解决:在运行期建立和删除原型。
  • 何时使用: 1、当一个系统应该独立于它的产品创建,构成和表示时。 2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。 3、为了避免创建一个与产品类层次平行的工厂类层次时。 4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
  • 如何解决:利用已有的一个原型对象,快速地生成和原型对象一样的实例。
  • 关键代码: 1、实现克隆操作,在 JAVA 实现 Cloneable 接口,重写 clone(),在 rust中可以使用clone() 方法来实现对象的深拷贝。 2、原型模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些"易变类"拥有稳定的接口。
  • 应用实例: 1、细胞分裂。 2、考试中为每个考生分发相同的试卷。

优点

1、性能提高。
2、逃避构造函数的约束。

缺点

1、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。

使用场景

1、资源优化场景。
2、类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。 3、性能和安全要求的场景。
4、通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。 5、一个对象多个修改者的场景。
6、一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。
7、在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。

实现

我们将创建一个抽象类 Shape 和扩展了 Shape 类的实体类。下一步是定义类 ShapeCache,该类把 shape 对象存储在一个 Hashtable 中,并在请求的时候返回它们的克隆。

PrototypePatternDemo 类使用 ShapeCache 类来获取 Shape 对象。

原型模式的 UML 图
在这里插入图片描述

java 实现

步骤 1
创建一个实现了 Cloneable 接口的抽象类。
Shape.java

public abstract class Shape implements Cloneable {
   
   private String id;
   protected String type;
   
   abstract void draw();
   
   public String getType(){
      return type;
   }
   
   public String getId() {
      return id;
   }
   
   public void setId(String id) {
      this.id = id;
   }
   
   public Object clone() {
      Object clone = null;
      try {
         clone = super.clone();
      } catch (CloneNotSupportedException e) {
         e.printStackTrace();
      }
      return clone;
   }
}

步骤 2
创建扩展了上面抽象类的实体类。
Rectangle.java

public class Rectangle extends Shape {
 
   public Rectangle(){
     type = "Rectangle";
   }
 
   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}

Square.java

public class Square extends Shape {
 
   public Square(){
     type = "Square";
   }
 
   @Override
   public void draw() {
      System.out.println("Inside Square::draw() method.");
   }
}

Circle.java

public class Circle extends Shape {
 
   public Circle(){
     type = "Circle";
   }
 
   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}

步骤 3
创建一个类,从数据库获取实体类,并把它们存储在一个 Hashtable 中。
ShapeCache.java

import java.util.Hashtable;
 
public class ShapeCache {
    
   private static Hashtable<String, Shape> shapeMap 
      = new Hashtable<String, Shape>();
 
   public static Shape getShape(String shapeId) {
      Shape cachedShape = shapeMap.get(shapeId);
      return (Shape) cachedShape.clone();
   }
 
   // 对每种形状都运行数据库查询,并创建该形状
   // shapeMap.put(shapeKey, shape);
   // 例如,我们要添加三种形状
   public static void loadCache() {
      Circle circle = new Circle();
      circle.setId("1");
      shapeMap.put(circle.getId(),circle);
 
      Square square = new Square();
      square.setId("2");
      shapeMap.put(square.getId(),square);
 
      Rectangle rectangle = new Rectangle();
      rectangle.setId("3");
      shapeMap.put(rectangle.getId(),rectangle);
   }
}

步骤 4
PrototypePatternDemo 使用 ShapeCache 类来获取存储在 Hashtable 中的形状的克隆。

PrototypePatternDemo.java

public class PrototypePatternDemo {
   public static void main(String[] args) {
      ShapeCache.loadCache();
 
      Shape clonedShape = (Shape) ShapeCache.getShape("1");
      System.out.println("Shape : " + clonedShape.getType());        
 
      Shape clonedShape2 = (Shape) ShapeCache.getShape("2");
      System.out.println("Shape : " + clonedShape2.getType());        
 
      Shape clonedShape3 = (Shape) ShapeCache.getShape("3");
      System.out.println("Shape : " + clonedShape3.getType());        
   }
}

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

Shape : Circle
Shape : Square
Shape : Rectangle

rust 实现

rsut中的clone实现起来比较简单,只需要为类添加clone属性就能够实现

#[derive(Clone)]
struct Shape{
    id:String,
    mtype:String
}
impl Shape{
    fn set_id(&mut self,id:String){
        self.id=id;
    }
    fn get_id(&self)->&str{
        &self.id
    }
}
#[derive(Clone)]
struct  Rectangle{
    shape:Shape
}
impl Rectangle {
    fn new()->Rectangle {
        Rectangle{shape:Shape{
            id:String::from("value"),
            mtype:String::from("Rectangle")
        }}
    }
    fn draw() {
        println!("Inside Rectangle::draw() method.");
    }
}
#[derive(Clone)]
struct  Square {
    shape:Shape
}
impl Square  {
    fn new()->Square  {
        Square {shape:Shape{
            id:String::from("value"),
            mtype:String::from("Square ")
        }}
    }
    fn draw() {
        println!("Inside Square ::draw() method.");
    }
}
#[derive(Clone)]
struct  Circle {
    shape:Shape
}
impl Circle  {
    fn new()->Circle {
        Circle {shape:Shape{
            id:String::from("value"),
            mtype:String::from("Square ")
        }}
    }
    fn draw() {
        println!("Inside Circle ::draw() method.");
    }
}

fn main(){
    let s=Circle::new();
    let mut s1=s.clone();
    s1.shape.set_id(String::from("dsf"));
    println!("{}",s.shape.id);
    println!("{}",s1.shape.id);

}

rust代码仓库

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

STL文件救急指南:当你的SolidWorks打不开高版本文件时,这3种转换方法能保命 当SolidWorks无法打开高版本文件时,STL格式可作为应急转换的通用解决方案。本文详细介绍了三种核心转换方法:从源头获取高质量STL、借助第三方CAD软件或在线工具中转,以及优化内部协作流程。重点指导如何设置关键导出参数以控制精度,并强调STL转换是有损过程,应作为数据交换的最后手段。 阅读详情

相关推荐

避坑指南:Dify+Docker+Ollama离线部署实战与疑难解析

本文详细解析了在国产化系统(如银河麒麟V10)内网环境中,如何从零开始离线部署Dify、Docker与Ollama的全栈AI应用开发平台。文章重点拆解了Docker安装中的“没有Release文件”和“GPG密钥错误”等典型报错解决方案,并提供了Ollama离线模型导入与Dify连接配置的完整实战指南,旨在帮助开发者高效完成本地部署,避开常见陷阱。

dd012的博客 465

【跟小嘉学 Rust 编程】三十二、Rust的设计模式(Design Patterns)

Rust不是面向对象的,设计模式与其他面向对象的编程语言不同,虽然细节不同,但是和具有相同的形式设计模式:是解决编写软件时常见问题的方法。反面模式:是解决这些相同的常见问题的方法。然而,在设计模式给我们带来好处的同时,反面模式却带来了更多的问题。惯常做法:是编码时要遵循的准则。它们是社区的社会规范。你可以打破它们,但如果你这样做,你应该有一个好的理由。主要教材参考 《The Rust Programming Language》主要教材参考 《Rust For Rustaceans》

小嘉丶学长的博客 2971

四足机器人关节电机FOC控制实战:从磁编码器校准到SVPWM调试避坑指南

本文详细解析了四足机器人关节电机FOC控制实战,涵盖磁编码器校准、电流环调试和SVPWM波形优化等关键环节。通过MIT Cheetah案例展示如何解决21倍电气误差问题,并提供相序自动校正、PI参数整定等实用代码片段,帮助工程师避开永磁同步电机(PMSM)控制中的常见陷阱。

weixin_29281915的博客 490

用Rust实现23种设计模式之 代理模式

代理模式是一种结构型设计模式,它允许通过代理对象来控制对真实对象的访问。在上述代码中,我们首先定义了共享接口Subject,并实现了具体对象RealSubject。RealSubject表示真实对象,实现了Subject接口的request方法。然后,我们定义了代理对象Proxy,它包含一个RealSubject对象作为其成员。Proxy实现了Subject接口的request方法,在方法中调用了RealSubject的request方法,并在调用前后执行了一些额外的操作。

Program with head, not hand 2224

CKEditor5富文本编辑器 - 视频引入、预览及自定义toolbar

文章目录定义遇到的问题视频部分引入媒体url失败原因解决方法:自定义视频provider视频预览及页面不显示视频问题解决方案:H5 \标签如何移除toolbar中的部分插件 一个小后端很少接触前端框架,只能在知识的海洋中漂泊。。。 定义 <script src="https://cdn.ckeditor.com/ckeditor5/16.0.0/classic/ckeditor.js"&gt...

huhui806的博客 8198

【Windows】 解决联想为主的所有自带摄像头(integrate camera)打不开的毛病(特别点名小新、thinkbook、thinkpad、y7000...)

解决联想系列电脑打不开自带摄像头的问题

Iamruzi的csdn博客 3万+

【一起学Rust | 设计模式】新类型模式

新的类型模式提供封装以及保证在编译时提供正确类型的值。新类型模式有多种用途和好处,比如可以处理不同的crate中的结构体和特质的关系。本期我们将一起探讨一下Rust设计模式中的新类型模式。本期内容是学习Rust设计模式笔记本期介绍了Rust设计模式中的新类型模式,并且指明了该设计模式的使用场景,其优点与缺点。并且通过一个实例来应用新类型模式,拓展包装类型的行为和特质,从而实现处理包与包之间结构体和特质的关系,限制类型内容等操作。...

专注Rust编程与技术分享,涵盖C++、Python等开发实战,新手友好,专注实战,助力编程成长。 10万+

YOLO11 改进系列 | 引入2023年 MLCA 的 C3k2_MLCA 模块,近零参数开销的本地-全局通道注意力,适合检测与分割特征增强

本文提出将MLCA(混合局部通道注意力)模块嵌入YOLOv11的C3k2框架中,形成C3k2_MLCA改进结构。该模块通过5×5局部池化和1×1全局池化双路融合,结合ECA式Conv1d生成通道注意力,在几乎不增加参数量的前提下(仅增加66个参数),实现了局部空间信息与全局通道统计的联合建模。相比传统SE和ECA注意力,MLCA保留了空间分布信息,更适合实例分割等需要精细定位的任务。实验表明改进后模型参数量仅增加0.002%,计算量基本不变,是一种高效的注意力增强方案。

qq_44224801的博客 93

原型模式

原型模式介绍   用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象,称为原型模式   原型模式是一个创建型模式,用户可以从一个样板对象中复制出一个内部属性一致的对象,这个过程就是"克隆"。被复制的对象实例就是"原型",这个原型是可以定制的。 原型模式应用场景 类初始化需要消耗非常多得资源,这个资源包括数据、硬件资源等,通过复制避免这些消耗。 通过new产生一个对象需要非常频繁的数据...

今天也要好好学习哟 689

滑块逆向及流程分析

本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

pyzzd的博客 8009

【目标检测】基于yolov5的安全帽佩戴检测系统(附代码和数据集)

【目标检测】基于yolov5的安全帽佩戴检测系统(附代码和数据集)

学无止境、积少成多、厚积薄发 3107

无垠式代码生成器多版本发布:新增 HTML 原型模式,功能升级稳定性提升!

这是最轻量级的代码生成器,采用 Servlet、JSP、JSON、Easy UI 等简单技术实现,是标准的 Model2 的 MVC 设计模式的架构,包含 JQuery Easy UI 的资源文件和全部示例,是喜欢使用低配服务器的程序员和运维人员的最佳选择。这是无垠式 Java 通用代码生成器的最新成员,纤量极速,令人爱不释手。

EveningTalk的博客 25

Android实现TextToSpeech控件实现语音播报--朗读文字 (附完整源码)

Android实现TextToSpeech控件实现语音播报--朗读文字 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1121

利用编译时工厂注册的机制, 开发一个container容器,对象如何继承成员BaseEntity则每次创建新实例,如果继续BaseEntitySingle 则每次返回相同 的对象

rust// 标记 trait:每次创建新实例// 标记 trait:单例模式// 自动实现 trait 的辅助宏特性生命周期每次获取创建新实例全局唯一实例内存管理调用者负责释放Container 持有所有权线程安全每个线程独立需要内部同步适用场景无状态的短暂对象配置、连接池、全局状态性能每次分配新内存缓存命中,零分配这个设计充分利用了 Rust 的编译期特性,将运行时决策最小化,保证了类型安全和零运行时开销的抽象。

leijmdas的专栏 46

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

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

无界弗远,驭光而至,通用代码生成器光船,先进功能演示

通用代码生成器:光船已经上线了。其名字来源于比利・迈尔事件中昴宿星人对他们的飞碟的称呼:“光船”,象征着极快的速度和卓绝的高科技。 新的介绍视频讲解了蛋糕船示例的 HTML 原型模式的生成和演示。此示例采用 Xlsx 文件格式。并使用此示例演示了数据磨坊和模板变形金刚功能群。演示了将传统 SGS 脚本生成为 Excel 模版的功能。视频请见:

jerryshen的专栏 746

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

无界弗远,驭光而至,WebAssembly通用代码生成器:光船简介

WebAssembly通用代码生成器:光船已经上线了。其名字来源于比利•迈尔事件中昴宿星人对他们的飞碟的称呼:“光船”,象征着极快的速度和卓绝的高科技。 目前,光船尚未启动WebAssembly技术栈的开发。目前是Rust语言tower技术栈的测试项目。 已经完成对代码结构的彻底重构。并支持Xlsx文件格式的后端代码生成。其代码是最先进的。是您入手动词算子式通用代码生成器源码学习很好的范例。

jerryshen的专栏 605

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

常见设计模式及其Rust实现

定义一个接口来创建几种不同种类的类,其中每个种类可能有若干相互依赖的组件。用户无需指定需要用哪些特定的组件。当需要创建一组相关或依赖的对象时,会使用这种方式。

DatenLord的博客 1797

Rust设计模式

设计模式(design pattern)是对软件设计中普遍存在的各种问题所提出的解决方案可维护性(maintainability):开发人员能够轻松地理解、修改和调试代码,以适应需求的变化或修复错误可读性(readability):可读性好的代码使用清晰的命名、适当的注释和良好的代码风格,使得其他开发人员能够快速理解代码的意图和功能可扩展性(extensibility):可扩展的代码设计考虑到未来的需求变化,通过模块化、低耦合和高内聚的设计,使得新增功能或修改现有功能变得容易灵活性(flexibility)

weixin_62799021的博客 1773

用Rust实现23种设计模式之 模板方法模式

模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将一些步骤的实现延迟到子类中。在上述代码中,我们首先定义了模板方法的抽象类AbstractClass,并定义了一个template_method方法,该方法定义了算法的骨架,其中包含了一些具体的步骤,这些步骤由子类实现。然后,我们创建了两个具体实现模板方法的子类ConcreteClassA和ConcreteClassB。这两个子类分别实现了AbstractClass中的具体步骤方法step1、step2和step3。

Program with head, not hand 569

用Rust实现23种设计模式之 策略模式

下面是一个简单的例子,演示如何使用 Rust 实现策略模式。

Program with head, not hand 2309

用Rust实现23种设计模式之单例

当Rust遇见设计模式,有多少种单例的实现方式呢?

Program with head, not hand 3162

用Rust实现23种设计模式之 命令模式

命令模式是一种行为型设计模式,它将请求封装成一个对象,从而使得可以用不同的请求对客户端进行参数化。在上述代码中,我们首先定义了命令接口Command,并实现了具体命令ConcreteCommandA和ConcreteCommandB。这些具体命令包含一个请求接收者Receiver,并在execute方法中调用接收者的相应操作。然后,我们定义了请求接收者Receiver,它包含了实际的操作方法action_a和action_b。

Program with head, not hand 422

【亲测免费】 探索设计模式之美:Rust 实现的 23 种经典 GoF 设计模式

![Design Patterns in Rust Logo](https://github.com/fadeevab/design-patterns-rust/workflows/Test%20All%20Patterns/badge.svg) 在编程的世界里,设计模式是软件设计中的通用解决方案,它们为开发者提供了一套可复用的模板,以解决常见问题。这个开源项目 `[Design Pattern

gitblog_00040的博客 701

Rust 新手入门:特质对象(Trait Objects)与面向对象设计模式及其限制

Rust 新手入门:特质对象(Trait Objects)与面向对象设计模式及其限制

m0_62599305的博客 512

Rust设计模式应用:创建型、结构型、行为型模式完全指南

Rust作为一门注重内存安全和性能的系统级编程语言,其独特的所有权模型和类型系统为设计模式的实现提供了新的可能性。本文将系统介绍Rust中常用的创建型、结构型和行为型设计模式,结合实际场景展示如何利用Rust特性实现优雅且安全的代码架构。 ## 创建型设计模式:安全高效的对象实例化 创建型模式专注于对象创建机制,在Rust中这些模式通常与所有权系统紧密结合,确保资源安全管理。 ### 工厂模

gitblog_07718的博客 455

【Rust】——面向对象设计模式的实现

状态模式(state pattern)是一个面向对象设计模式。该模式的关键在于定义一系列值的内含状态。这些状态体现为一系列的状态对象,同时值的行为随着其内部状态而改变。我们将编写一个博客发布结构体的例子,它拥有一个包含其状态的字段,这是一个有着 "draft"、"review" 或 "published" 的状态对象 状态对象共享功能:当然,在 Rust 中使用结构体和 trait 而不是对象和继承。每一个状态对象负责其自身的行为,以及该状态何时应当转移至另一个状态。持有一个状态对象的

shsjssnn的博客 4250
上一篇: Java Lambda 表达式笔记
下一篇: 适配器模式 rust和java的实现
过去日记
过去日记 新星创作者: 后端开发技术领域 新星创作者: 后端开发技术领域
博客等级 码龄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、付费专栏及课程。

余额充值