软件模式-原型模式

news/2024/9/18 5:11:41/文章来源:https://www.cnblogs.com/torrentgz/p/18411028

原型模式的核心思想
原型模式的核心是使用一个原型接口来定义一个克隆方法,该方法允许对象自身进行复制。通过这个克隆方法,可以快速生成一个与原型对象相同的实例,而不需要直接创建新对象并手动设置属性。

原型模式的结构
原型接口(Prototype):定义一个 clone() 方法,用于克隆对象。
具体原型类(Concrete Prototype):实现原型接口,提供自身的复制方法。
客户端(Client):通过调用原型对象的 clone() 方法来创建新的对象,而不是通过构造函数。
原型模式的实现
示例:假设我们有一个 Shape 类,使用原型模式来克隆不同类型的形状对象。

import java.util.HashMap;
import java.util.Map;
// 原型接口
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;
}
// 实现克隆方法
@Override
public Object clone() {Object clone = null;try {clone = super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return clone;
}

}
// 具体原型类:Rectangle
class Rectangle extends Shape {
public Rectangle() {
type = "Rectangle";
}

@Override
public void draw() {System.out.println("Drawing a Rectangle");
}

}
// 具体原型类:Circle
class Circle extends Shape {
public Circle() {
type = "Circle";
}

@Override
public void draw() {System.out.println("Drawing a Circle");
}

}
// 具体原型类:Square
class Square extends Shape {
public Square() {
type = "Square";
}

@Override
public void draw() {System.out.println("Drawing a Square");
}

}
// ShapeCache 用于缓存形状对象并克隆
class ShapeCache {
private static Map<String, Shape> shapeMap = new HashMap<>();
// 获取缓存的形状的克隆对象
public static Shape getShape(String shapeId) {
Shape cachedShape = shapeMap.get(shapeId);
return (Shape) cachedShape.clone();
}

// 模拟加载形状对象到缓存
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);
}

}
// 测试类
public class Main {
public static void main(String[] args) {
// 预加载缓存中的形状对象
ShapeCache.loadCache();

    // 通过克隆获取对象Shape clonedShape1 = ShapeCache.getShape("1");System.out.println("Shape : " + clonedShape1.getType());  // 输出 "Shape : Circle"Shape clonedShape2 = ShapeCache.getShape("2");System.out.println("Shape : " + clonedShape2.getType());  // 输出 "Shape : Square"Shape clonedShape3 = ShapeCache.getShape("3");System.out.println("Shape : " + clonedShape3.getType());  // 输出 "Shape : Rectangle"
}

}
原型模式的要点
克隆方法:在 Shape 类中,clone() 方法来自 Cloneable 接口,允许创建当前对象的副本。
缓存原型对象:ShapeCache 类缓存了各种形状对象,并通过 getShape() 方法来克隆它们,客户端可以从缓存中获取新对象,而无需重新创建。
对象的浅拷贝和深拷贝:clone() 方法默认进行的是浅拷贝,如果对象包含引用类型的成员变量,可能需要进行深拷贝。
浅拷贝与深拷贝
浅拷贝:只复制对象的基本类型字段和对象引用,引用类型的字段指向的是同一个对象(即对象内引用的对象未被复制)。
深拷贝:不仅复制对象本身,还递归复制对象所引用的所有对象。深拷贝可以通过手动实现,或者使用序列化的方式来完成。
原型模式在现实中的应用
对象池:比如在数据库连接池中,可以通过克隆原型连接来快速创建新的数据库连接对象。
游戏开发:在游戏中,常常需要创建相似的对象(如游戏角色、道具等),原型模式可以用来快速复制对象并应用不同的属性。
文档编辑软件:可以将常用的模板文档作为原型,快速生成新的文档副本。
通过使用原型模式,Java开发者可以有效提高对象创建的效率,减少资源消耗,并且方便地管理对象的复制和创建过程。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从kmp到AC自动机

知道kmp的请跳过这一段 找到最清晰的解析 kmp 我看了约114514个解析才搞懂 如何求next 首先,next[i]本应表示0~i的字符串的最长相同前缀后缀的长度。 不过为了方便匹配,实际可以存最长相同前缀后缀时前缀最后一个的地址 听起来好绕 那这么说吧: 例如串 abaabaabaab next[0]=…

LinkedHashMap原理详解—从LRU缓存机制说起

写在前面 从一道Leetcode题目说起 首先,来看一下Leetcode里面的一道经典题目:146.LRU缓存机制,题目描述如下:请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类:LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 in…

微积分快速入门1部分:直觉

1 一分钟微积分:X射线和延时视觉 我们通常只看到图形、公式和情况的表面价值。微积分为我们提供了两种深入挖掘的超能力:X射线能看到图案中隐藏的部分。你不仅能看到树,还能知道它是由年轮组成的,在我们说话的同时,另一个年轮也在生长。延时视觉你能看到物体未来的运行轨迹…

torch.nn.Embedding的导入与导出

简介及导入转自:torch.nn.Embedding使用在RNN模型的训练过程中,需要用到词嵌入,使用torch.nn.Embedding可以快速的完成:只需要初始化torch.nn.Embedding(n,m)即可(n是单词总数,m是词向量的维度)(n是嵌入字典的大小,m是嵌入向量的维度。)。 注意: embedding开始是随机的…

第十七讲 为什么这些SQL语句逻辑相同,性能却差异巨大?

第十七讲: 为什么这些SQL语句逻辑相同,性能却差异巨大? 简概:引入: ​ 在 MySQL 中,有很多看上去逻辑相同,但性能却差异巨大的 SQL 语句。对这些语句使用不当的话,就会不经意间导致整个数据库的压力变大。我今天挑选了三个这样的案例和你分享。希望再遇到相似的问题时,…

2024-09-12 TypeError: Cannot read properties of undefined (reading 0) ==》检查未定义的对象or数组

TypeError: Cannot read properties of undefined (reading 0) ==》TypeError:无法读取undefined的属性(读取“0”) 请记住出现这种错误大多数都是因为你读取了未定义的对象或数组 排查结果:后端返回的id由原来的小写id改成了大写Id。 666,服了,哥们。

UNO 已知问题 在后台线程触发 SKXamlCanvas 的 Invalidate 且在 PaintSurface 事件抛出异常将炸掉应用

本文记录一个 UNO 已知问题,在 UNO 里面可以利用 SKXamlCanvas 对接 Skia 绘制到应用里面。如果此时在后台线程里面调用 SKXamlCanvas 的 Invalidate 触发界面的重新刷新,但在具体的执行绘制 PaintSurface 事件里面对外抛出异常,将会导致应用炸掉背景: 我准备在 UNO 里面将…

WPF 的 WriteableBitmap 在 Intel 11 代 Iris Xe Graphics 核显设备上停止渲染

在 Intel 11 代锐炬 Intel Iris Xe Graphics 核显设备上,如果此设备使用旧版本驱动,则可能导致 WPF 的 WriteableBitmap 停止渲染。此问题和 WPF 无关,此问题是 Intel 的 bug 且最新驱动版本已修复官方问题记录地址:https://www.intel.cn/content/www/cn/zh/support/articl…

WPF 的 Viewport3D 等 3D 模块在带 Intel UHD 770 设备上抛出渲染异常

在带 Intel UHD 770 的设备上,使用旧版本驱动,即小于 30.0.101.1660 版本驱动,将会导致 WPF 的 3D 模块出现渲染异常。此问题和 WPF 无关,此问题是 Intel 的 bug 且最新驱动版本已修复官方问题记录地址:https://community.intel.com/t5/Graphics/Crash-with-UHD-770-in-WP…

【Azure Service Bus】批量处理Service Bus Topic 中的死信消息(dead-lettered messages)

问题描述 在Azure的门户页面上,因为Service Bus Topic中有很多dead-lettered message,而这些消息占用了大量的存储空间,通过门户上的Service Bus Explorer每次只能消费一条消息。 虽然可以通过修改代码来指定消费私信队列中消息,但是需要修改代码,需要一些工作量。 有没有…

Transformer两大发展方向——GPT系列及BERT(一)

前面介绍了Transformer,随着其发展在NLP领域应用越来越多,在其基础上主要有两篇影响非常大的文章,一篇是GPT,另一篇是BERT。OpenAI提出的GPT采用Transformer解码器结构,一路更新迭代到了现在有了GPT-4,而Google提出的BERT采用Transformer的编码器结构。大体时间线如下图所…

RustPython简单使用

RustPython介绍 同CPython,Jpython,PyPy一样,RustPython,是使用Rust语言实现的Python解释器,支持Python3语法。 项目地址:https://github.com/RustPython/RustPython RustPython真正方便的是可以编译成Wasm文件,可以直接在浏览器中使用,示例网站:https://rustpython.g…