Java设计模式-原型模式-一次性理解透

news2025/1/25 9:04:51

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 1. 前言
  • 2. 原型模式的主要角色
    • 2.1 原型接口或抽象类
    • 2.2 具体原型类
    • 2.3 客户端
    • 2.4 克隆方法
  • 3. 原型模式使用场景
    • 3.1 创建对象是昂贵的
    • 3.2 对象的变化
    • 3.3 动态配置
    • 3.4 减少初始化开销
  • 4. 原型模式的代码示例
    • 4.1 原型接口:Shape
    • 4.2 具体原型():Circle
    • 4.3 客户端():ShapeClient
    • 4.4 上述示例的完整代码
  • 5. 总结


在这里插入图片描述

1. 前言

原型模式(Prototype Design Pattern)是一种创建型设计模式,‌它允许通过复制一个已经存在的对象来创建一个新的对象,‌而无需重新实例化。‌这种模式特别适用于那些需要创建类似对象的情况,‌可以避免重复的代码和资源浪费。‌原型模式的核心在于提供一个原型对象,‌通过这个原型对象来生成其他对象,‌而不需要知道这些对象的类结构。‌

2. 原型模式的主要角色

在这里插入图片描述

2.1 原型接口或抽象类

原型接口或抽象类声明了用于克隆对象的方法。它定义了具体原型必须实现的通用接口,确保所有原型都可以以一致的方式进行克隆。

  • 主要作用是通过指定克隆契约来提供创建新对象的蓝图。
  • 它声明了clone具体原型实现的方法来生成自身的副本。

2.2 具体原型类

实现了抽象原型类中的clone()方法,‌负责创建与原型对象相同的新对象。‌

  • 它定义了如何对该类的实例执行克隆过程的细节。
  • 实现clone原型接口中声明的方法,提供该类特有的克隆逻辑。

2.3 客户端

客户端是通过与原型交互来请求创建新对象的代码或模块。它启动克隆过程,但不知道所涉及的具体类。

2.4 克隆方法

clone 方法在原型接口或抽象类中声明。它指定应如何复制或克隆对象。具体原型实现此方法来定义其独特的克隆行为。它描述了应如何复制对象的内部状态以创建新的独立实例。

3. 原型模式使用场景

3.1 创建对象是昂贵的

当创建对象比复制现有对象更昂贵或更复杂时,使用原型模式。
如果对象创建涉及大量资源,例如数据库或网络调用,并且您有可用的类似对象,则克隆会更有效率。

3.2 对象的变化

当您的系统需要支持多种略有变化的对象时,请使用原型模式。
您可以创建原型并通过修改进行克隆,而不必为每个变体创建多个类。

3.3 动态配置

当您的系统需要动态配置并且您想要在运行时创建具有配置的对象时,请使用原型模式。
您可以创建基本配置的原型并克隆它,并根据需要调整属性。

3.4 减少初始化开销

当您想要减少初始化对象的开销时,请使用原型模式。
创建克隆比从头创建对象更快,尤其是在初始化过程耗费大量资源的情况下。

4. 原型模式的代码示例

示例场景:假设您正在开发一个绘图应用程序,需要创建和操作各种形状。每个形状可能具有不同的属性,例如颜色或大小。为每个变体创建新的形状类会变得很麻烦。此外,在运行时动态添加或删除形状也很有挑战性。

让我们了解原型设计模式如何帮助解决这个问题:

  • 原型设计模式有助于有效地管理形状的变化,提高形状创建的灵活性,并简化在运行时添加或删除形状的过程。
  • 原型设计模式通过引入原型接口(Shape)来解决此问题,该接口声明了克隆和绘制形状的常用方法。
  • 具体原型类似于Circle实现这个接口,提供它们独特的克隆逻辑。
  • 扮演ShapeClient用户的角色,利用原型创建新的形状。

在这里插入图片描述

4.1 原型接口:Shape

我们定义一个名为的接口Shape作为原型。它声明了两种方法:clone()复制自身和draw()绘制形状。

// This is like a blueprint for creating shapes.
// It says every shape should be able to clone itself and draw.
public interface Shape {
	Shape clone(); // Make a copy of itself
	void draw(); // Draw the shape
}

4.2 具体原型():Circle

我们Shape用一个具体的类来实现接口CircleCircle该类有一个私有字段color和一个构造函数,用于在创建圆时设置颜色。它实现了clone()创建自身副本(Circle具有相同颜色的新副本)的方法。该draw()方法用于打印一条消息,指示如何绘制圆。

// This is a specific shape, a circle, implementing the Shape interface.
// It can create a copy of itself (clone) and draw in its own way.
public class Circle implements Shape {
	private String color;

	// When you create a circle, you give it a color.
	public Circle(String color) {
		this.color = color;
	}

	// This creates a copy of the circle.
	@Override
	public Shape clone() {
		return new Circle(this.color);
	}

	// This is how a circle draws itself.
	@Override
	public void draw() {
		System.out.println("Drawing a " + color + " circle.");
	}
}

4.3 客户端():ShapeClient

我们创建一个客户端类ShapeClient,它将使用原型来创建新的形状。客户端有一个字段shapePrototype表示它将使用的原型。构造函数采用Shape原型,并且有一个方法createShape()可以使用原型的clone()方法创建新的形状。

// This is like a user of shapes.
// It uses a prototype (a shape) to create new shapes.
public class ShapeClient {
	private Shape shapePrototype;

	// When you create a client, you give it a prototype (a shape).
	public ShapeClient(Shape shapePrototype) {
		this.shapePrototype = shapePrototype;
	}

	// This method creates a new shape using the prototype.
	public Shape createShape() {
		return shapePrototype.clone();
	}
}

4.4 上述示例的完整代码

在主类PrototypeExample中,我们创建了一个红色圆圈的具体原型(circlePrototype)。然后,我们创建一个ShapeClient,并为其提供红圈原型。客户端使用原型通过createShape()方法创建新形状(redCircle)。最后,我们使用draw()方法绘制新创建的红色圆圈。

// Prototype interface
interface Shape {
	Shape clone(); // Make a copy of itself
	void draw(); // Draw the shape
}

// Concrete prototype
class Circle implements Shape {
	private String color;

	// When you create a circle, you give it a color.
	public Circle(String color) {
		this.color = color;
	}

	// This creates a copy of the circle.
	@Override
	public Shape clone() {
		return new Circle(this.color);
	}

	// This is how a circle draws itself.
	@Override
	public void draw() {
		System.out.println("Drawing a " + color + " circle.");
	}
}

// Client code
class ShapeClient {
	private Shape shapePrototype;

	// When you create a client, you give it a prototype (a shape).
	public ShapeClient(Shape shapePrototype) {
		this.shapePrototype = shapePrototype;
	}

	// This method creates a new shape using the prototype.
	public Shape createShape() {
		return shapePrototype.clone();
	}
}

// Main class
public class PrototypeExample {
	public static void main(String[] args) {
		// Create a concrete prototype (a red circle).
		Shape circlePrototype = new Circle("red");

		// Create a client and give it the prototype.
		ShapeClient client = new ShapeClient(circlePrototype);

		// Use the prototype to create a new shape (a red circle).
		Shape redCircle = client.createShape();

		// Draw the newly created red circle.
		redCircle.draw();
	}
}

5. 总结

在本文,我们学习了Java的一种创建型设计模式原型模式,知道它拥有原型接口具体原型类客户端克隆方法四个角色,还阐述了原型模式的使用场景,以及呈现了原型模式的代码示例,相信大家应该对原型模式不陌生了!!

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

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

相关文章

10-使用sentinel流控

本文介绍sentinel的直接流控的使用。 0、环境 jdk 1.8sentinel 1.8.2springboot 2.4.2 1、sentinel环境搭建 从官方发布的网站上下载: sentinel Jar,下载对应版本。 下载完成后,进入刚才下载的Jar文件所在的目录,执行如下命令&#xff1a…

Qt+OpenCV配置和测试

一、前言 OpenCV作为比较大众化的跨平台计算机视觉开源库,可以运行在多种操作系统上,通过与Qt的结合,能够轻松的是实现一些图像处理和识别的任务,本文在Windows操作系统的基础上具体讲解Qt和OpenCV的配置和环境搭建方法&#xff…

PHP企业员工考勤系统—计算机毕业设计源码17108

摘要 由于数据库和数据仓库技术的快速发展,企业员工考勤系统建设越来越向模块化、智能化、自我服务和管理科学化的方向发展。员工管理系统对处理对象和服务对象,自身的系统结构,处理能力,都将适应技术发展的要求发生重大的变化。 …

叉车安装人脸识别管理系统,能带来哪些好处

当今工业生产中,叉车是一种常见的运输工具,广泛应用于各种场景,如工厂、仓库、码头等。然而,由于驾驶员的错误操作或非授权人员的驾驶,叉车在使用过程中可能会发生意外事故,给企业带来不小的损失。 为了提…

LangChain之数据库操作:通过链Chain和代理Agent查询数据库信息

Chain和Agent查询数据库 在LangChain,其提供了SQL Chain链和SQL Agent代理,他们支持基于自然语言提示构建和运行SQL查询,以此来操作数据库,并且与SQLAlchemy支持的任何SQL版本兼容。(例如,MySQL&#xff0c…

自闭症儿童注意力分散怎么办?|星启帆自闭症寄宿学校

在自闭症儿童的成长过程中,一个常见且令人担忧的现象是“精神飘移行为”,这种行为表现为孩子沉浸在自己的小世界里,对外界刺激反应迟钝,甚至完全忽视。他们可能会做出一些怪异的动作、表现出刻板行为、自言自语,眼神呆…

Kafka服务端日志详解

文章目录 服务端日志Topic消息存储方式主体介绍log文件追加记录消息index和timeindex索引文件 日志文件清理Kafka的文件高效读写机制Kafka的文件结构顺序写磁盘零拷贝 合理配置刷盘频率客户端消费进度管理 服务端日志 Kafka的日志信息是通过conf/server.properties文件中的log…

用苹果机连接mac后怎么在电脑上调试苹果手机上页面的元素

问: 用苹果机连接mac后怎么在电脑上调试苹果手机上页面的元素, 使用MAC电脑、iPhone 真机调试 H5页面 回答: 使用MAC电脑、iPhone 真机调试 H5页面 简介 Safari 浏览器设置iPhone 手机设置开始调试 简介 为方便在 H5开发过程中在真实手机调试 H5页面,可进行一下…

Mybatis-springBoot

MyBatis 是一个流行的 Java 持久层框架,它简化了与关系型数据库的交互。通过将 SQL 语句与 Java 代码进行映射,MyBatis 提供了一种方便、灵活的方式来执行数据库操作。它支持动态SQL、缓存机制和插件扩展,使得开发人员能够更高效地编写和管理…

重学我的数据结构

二叉树 1. 遍历 (Traversal) 前序遍历 (Preorder Traversal): 先访问根节点,再访问左子树,最后访问右子树。 void preorderTraversal(Node root) {if (root null) return; System.out.print(root.value " "); preorderTraversal(root.left)…

韦东山瑞士军刀项目之I2C控制ssd 1306 OLED显示屏幕驱动源码分析(硬核)

太硬核了,但即便如此,我也只分析了如何实现ssd 1306的控制命令与显示命令的代码。尽管如此,我也了解了如何实现I2C的字符输出显示。意外收获是知道了ASCII码到底是个什么玩意儿。

python pygame如何实现碰撞检测

前言: 在python中,我们实现两个物品的碰撞检测往往是判断两个物体的x、y坐标是否有重合,根据坐标来进行判断,但是这种判断方式往往不太准确,对于一些透明部分,会出现误判的情况,今天介绍的是一…

古印度的未解之谜——哈拉帕印章文字

关注我们 - 数字罗塞塔计划 - 在之前的文章中,我们知晓了古埃及莎草纸的制作工艺(参见《莎草纸——数千年前的信息记录载体》),也了解了由粘土变为陶片可保存数千年的苏美尔泥板书(参见《泥板书:两河文明传…

暑期破防实录——捡漏腾讯

序 经历了整整三个月的折磨,暑期实习终于尘埃落定。 其实还没收到 offer 的时候,还会想着到时候录用了该怎么大写特写小作文,但真到了这一天,只剩下一种解脱感,一种摆脱了漫长的焦虑与压抑的淡淡喜悦。 或许就像久病…

Java垃圾收集底层算法实现

垃圾收集底层算法实现 三色标记 在并发标记的过程中,因为标记期间应用线程还在继续跑,对象间的引用可能发生变化,多标和漏标的情况就有可能发生。漏标的问题主要引入了三色标记算法来解决。 三色标记算法是把Gc roots可达性分析遍历对象过…

QT翻金币小游戏

目录 QT翻金币小游戏 效果展示 图片 视频 实现代码 main.cpp mymainwindow.h mymainwindow.cpp startscene.h startscene.cpp selectscene.cpp playscene.h playscene.cpp mypushbutton.h mypushbutton.cpp dataconfig.h dataconfig.cpp QT翻金币小游戏 效果展示…

什么是进程?C语言

进程的概念 进程就是执行中的程序,是系统资源分配的最小单位。 进程的内存分配 进程的作用 宏观上是并行的,微观上是串行的 进程的状态 对于基本的操作系统:有三个状态: 就绪态->执行态-> 阻塞态 在LInux中有四种&am…

docker数据卷、资源控制

一、docker数据卷: 1.容器和宿主机之间数据共享----挂载卷----容器内的目录和宿主机的目录进行挂载。实现数据文件共享容器的生命周期有限,一旦重启所有对容器内部文件数据的修改以及保存的数据都会被初始化,所以为了防止数据丢失重要的组件…

前端学习大纲 | 主流前端技术 | 学习路线

需要完整的学习路线的宝子可以点击获取:点击即可获取完整的学习路线 第一阶段(页面还原能力) HTML5、CSS3、Git 第二阶段(专攻 JS 逻辑能力) JavaScript 基础、JavaScript 进阶、JavaScript 高级、ES6 第三阶段&a…

【Java】如何使用jdbc连接并操作MySQL,一文读懂不迷路,小白也能轻松学会

JDBC的原理 JDBC(Java Database Connectivity)是Java提供的用于连接和操作数据库的API。它允许Java应用程序与各种数据库进行交互,以下是JDBC的基本原理: 驱动程序管理:JDBC使用不同的数据库驱动程序来连接不同类型的…