当前位置: 首页 > news >正文

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

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

文章目录

  • 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 itselfvoid 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.@Overridepublic Shape clone() {return new Circle(this.color);}// This is how a circle draws itself.@Overridepublic 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 itselfvoid 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.@Overridepublic Shape clone() {return new Circle(this.color);}// This is how a circle draws itself.@Overridepublic 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的一种创建型设计模式原型模式,知道它拥有原型接口具体原型类客户端克隆方法四个角色,还阐述了原型模式的使用场景,以及呈现了原型模式的代码示例,相信大家应该对原型模式不陌生了!!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 看demo学算法之 卷积神经网络(CNN)
  • 鸿蒙原生应用元服务开发-初识仓颉开发语言
  • Unity(2022.3.38LTS) - 输入
  • 企业电子招投标采购系统——功能模块功能描述+数字化采购管理 采购招投标
  • 【C++ 第十章】继承
  • php防止页面重复刷新或者重复提交
  • Excel表格使用IF条件判断
  • 介绍一下react中虚拟dom和diff算法
  • 第N5周:Pytorch文本分类入门
  • 如何在香港云服务器上优化网站性能?
  • 基于车联网大数据平台的用户驾驶习惯行为画像分析
  • AI学习记录 - 自注意力机制之权重矩阵和查询向量V矩阵的计算方式的补充
  • RCE绕过练习
  • 工厂模式和策略模式区别以及使用
  • STM32第十二节(中级篇):串口通信(第二节)——串口固件库函数以及串口发送和接收代码讲解
  • 《Java编程思想》读书笔记-对象导论
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • AHK 中 = 和 == 等比较运算符的用法
  • C++入门教程(10):for 语句
  • echarts的各种常用效果展示
  • ES6 学习笔记(一)let,const和解构赋值
  • go语言学习初探(一)
  • java小心机(3)| 浅析finalize()
  • JS学习笔记——闭包
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • 工作手记之html2canvas使用概述
  • 工作中总结前端开发流程--vue项目
  • 利用jquery编写加法运算验证码
  • 如何学习JavaEE,项目又该如何做?
  • 数据科学 第 3 章 11 字符串处理
  • 算法-图和图算法
  • 一份游戏开发学习路线
  • 《码出高效》学习笔记与书中错误记录
  • HanLP分词命名实体提取详解
  • 阿里云移动端播放器高级功能介绍
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​数据链路层——流量控制可靠传输机制 ​
  • #、%和$符号在OGNL表达式中经常出现
  • #if和#ifdef区别
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (Ruby)Ubuntu12.04安装Rails环境
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (十五)使用Nexus创建Maven私服
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net 4.0并行库实用性演练
  • .NET6 命令行启动及发布单个Exe文件
  • .net解析传过来的xml_DOM4J解析XML文件
  • /var/spool/postfix/maildrop 下有大量文件
  • :中兴通讯为何成功