设计模式创建型模式之原型模式

news2024/9/23 13:15:59

设计模式之原型模式

  • 一、背景
    • 1、解决性能问题
    • 2、对象的创建需要运行时信息
    • 3、对象的创建过程复杂
    • 4、对象的创建与使用分离
  • 二、介绍
    • 1、定义
    • 2、组成
  • 三、代码实现
    • 1、实现Cloneable接口
    • 2、代码实现分析
    • 3、注意事项
  • 四、总结
    • 1、实现Cloneable接口
    • 2、原型模式的优点包括:
    • 3、原型模式的缺点包括:
    • 4、运用1
    • 5、运用2

一、背景

1、解决性能问题

解决对象创建的性能问题。在某些情况下,创建对象的过程是复杂且耗时的,如果需要创建大量相似的对象,就会导致性能下降。原型模式通过复制已有对象的方式来创建新对象,避免了创建对象的耗时操作,提高了性能。

2、对象的创建需要运行时信息

有些对象的创建需要根据运行时的信息进行判断,如果使用传统的创建方式,就需要在代码中加入大量的条件判断语句,使得代码变得复杂且难以维护。而原型模式通过克隆已有对象的方式来创建新对象,避免了条件判断的复杂性。

3、对象的创建过程复杂

有些对象的创建过程包含了多个步骤,例如初始化属性、连接数据库等,如果需要创建大量相似的对象,这些步骤都需要重复执行,导致性能下降。而原型模式通过复制已有对象的方式来创建新对象,避免了这些复杂的初始化过程。

4、对象的创建与使用分离

使用传统的创建方式,对象的创建与使用是紧密耦合的,创建对象的代码必须在使用对象的代码之前。而原型模式将对象的创建与使用分离开来,通过克隆已有对象的方式来创建新对象,使得对象的创建可以在不同的时间和地点进行,提高了系统的灵活性和扩展性。

二、介绍

1、定义

原型模式是一种创建型设计模式,用于创建对象的克隆。它通过复制现有对象的原型来创建新的对象,而无需通过实例化类来创建对象。

2、组成

原型模式包含以下几个角色:

  • 抽象原型类:定义具体原型类必须实现的方法。
  • 具体原型类:实现抽象原型类的克隆方法,实现对象的复制和克隆。
  • 客户端类:使用具体原型类的克隆方法来创建新的对象。

三、代码实现

1、实现Cloneable接口

在Java中,原型模式的实现通常需要实现Cloneable接口,并重写clone()方法来进行对象的复制,同时需要保证对象的成员变量是可拷贝的。

2、代码实现分析

首先,我们创建一个原型类Person ,包含一个方法clone():

package org.storemanage.regestercenter.prototypemode;

/**
 * @CreateTime: 2024-08-28
 * @Description: 原型人
 * @Version: 1.0
 * @Author: hkf
 */

public class Person implements Cloneable {

    private String  name;

    public Person(String personName) {
        this.name = personName;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public  void say(){
        System.out.println("说话声音真大!!!");
    }

    public Object clone() throws CloneNotSupportedException {
       return super.clone();
    }
}

然后,我们创建具体原型类PersonTest ,实现Person:

package org.storemanage.regestercenter.prototypemode;

/**
 * @CreateTime: 2024-08-29
 * @Description: 测试类
 * @Version: 1.0
 * @Author: hkf
 */

public class PersonTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        //创建相同的对象

        for (int i = 0; i < 2; i++) {
            Person  ps = new Person("王麻子");
            System.out.println("王麻子的地址为:"+ps);
            System.out.println(ps.getName());
        }

        //原型模式创建对象
        Person person1 = new Person("张三");
        Person person2 = (Person) person1.clone();

        System.err.println("person1的人类地址为:" + person1);
        System.err.println("person2的人类地址为:" + person2);
        System.out.println("person1的人类名称为:" + person1.getName());
        System.out.println("person2的人类名称为:" + person2.getName());

        person1.setName("李四");
        System.out.println("设置过值person1的人类名称为:" + person1);
        System.err.println("设置过值person2的人类名称为:" + person2);
        System.out.println("person1的人类名称为:" + person1.getName());
        System.err.println("person2的人类名称为:" + person2.getName());

    }
}

结果如下

王麻子的地址为:org.storemanage.regestercenter.prototypemode.Person@52af6cff
王麻子
王麻子的地址为:org.storemanage.regestercenter.prototypemode.Person@735b478
王麻子
person1的人类名称为:张三
person2的人类名称为:张三
设置过值person1的人类名称为:org.storemanage.regestercenter.prototypemode.Person@2096442d
person1的人类名称为:李四
person1的人类地址为:org.storemanage.regestercenter.prototypemode.Person@2096442d
person2的人类地址为:org.storemanage.regestercenter.prototypemode.Person@9f70c54
设置过值person2的人类名称为:org.storemanage.regestercenter.prototypemode.Person@9f70c54
person2的人类名称为:张三

Process finished with exit code 0

在以上示例中,我们通过调用person1的clone()方法,得到了一个克隆的person2对象。然后我们修改person1的name属性,发现person2的name属性并未改变,证明它们是两个独立的对象。

3、注意事项

因为Object是所有类的老大,默认都继承他,clone方法也是Object类提供的,如果不实现CloneAble接口。则会报错,示例如下

Exception in thread "main" java.lang.CloneNotSupportedException: org.storemanage.regestercenter.prototypemode.Person
	at java.base/java.lang.Object.clone(Native Method)
	at org.storemanage.regestercenter.prototypemode.Person.clone(Person.java:32)
	at org.storemanage.regestercenter.prototypemode.PersonTest.main(PersonTest.java:25)

Process finished with exit code 1

四、总结

1、实现Cloneable接口

原型模式的实现通常需要实现Cloneable接口,并重写clone()方法来进行对象的复制

2、原型模式的优点包括:

  1. 在运行时动态生成对象,避免了类的实例化过程,提高了对象的创建效率。
  2. 可以通过复制现有对象的原型来创建新的对象,而无需知道具体的创建细节。
  3. 可以通过修改原型对象的属性来创建不同的对象,避免了重复的初始化过程。

3、原型模式的缺点包括:

  1. 需要实现Cloneable接口,并重写clone()方法,如果对象的成员变量是复杂对象,则需要保证这些对象也是可拷贝的。
  2. 对象的复制可能会带来一些潜在的问题,例如深拷贝和浅拷贝的区别。
  3. 原型模式在创建对象时,没有调用类的构造函数,可能会绕过一些必要的初始化过程。

4、运用1

在实际应用中,原型模式常用于创建复杂的对象,尤其是那些需要耗费大量资源或时间的对象。通过原型模式,可以通过复制一个已有的对象来创建新的对象,从而避免了重复的初始化过程,提高了性能和效率。

5、运用2

原型模式是一种创建型设计模式,通过复制现有对象来创建新的对象。它主要解决了创建对象的开销问题,避免了直接创建对象的耗时操作。原型模式基于原型实例的克隆来创建新的对象,即通过克隆原型对象得到一个新的对象。
在这里插入图片描述

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

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

相关文章

QString 初始化

QString不用初始化&#xff0c;创建变量的时候默认就初始化了 默认构造函数&#xff1a;QString 的默认构造函数会初始化一个空的 QString 对象。具体来说&#xff0c;这是一个“空字符串”&#xff08;empty string&#xff09;&#xff0c;而不是指针为 nullptr 的情况。空字…

医疗知识图谱工程研究记录

医疗诊断知识图谱 本项目是基于知识图谱的知识问答项目。过程为对问句进行解析&#xff0c;形成若干三元组及相关的操作条件&#xff0c;转换为查询语句&#xff0c;查询数据库返回结果。 KBQA方式的问答包括意图分析、标签&#xff08;实体、操作符&#xff09;识别、条件体…

Linux2-Linux基础命令

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 一、Linux的目录结构 Linux的目录结构是一个树型结构 Windows 系统可以拥有多个盘符, 如 C盘、D盘、E盘 Linux没有盘符这个概念, 只有一个根目录 /, 所有文件都在它下面 练习 请根据语言描述&am…

Linux 2.6 内核进程调度队列

Linux 2.6 内核进程调度队列 运行队列&#xff08;runqueue&#xff09;蓝色区域&#xff08;活动队列&#xff09;queuebitmapnr_active总结&#xff1a;时间片还没有结束的所有进程都按照优先级放在该队列&#xff08;活动队列&#xff09; 红色区域&#xff08;过期队列&…

scrapy框架--快速了解

免责声明:本文仅做分享~ 目录 介绍: 5大核心组件: 安装scrapy: 创建到启动: 修改日志配置:settings.py 修改君子协议配置: 伪装浏览器头: 让代码去终端执行: 数据保存: 1-基于命令 2-基于管道 文档: 介绍: 5大核心组件: Scrapy是一个开源的Python框架&#xff0c…

【3.5】贪心算法-解优势洗牌(类田忌赛马问题)

一、问题 给定两个 大小相等的数组 A 和 B &#xff0c;A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。 返回 A 的任意排列&#xff0c;使其相对于 B 的优势最大化。 二、解题思路 这个问题要求我们重新排列数组A&#xff0c;使得在相同位置上&#xf…

Ubuntu 24.04部署Wordpress

环境&#xff1a; Ubuntu 24.04 PHP 8.1.2-1ubuntu2.18 Nginx/1.18.0 (Ubuntu) WordPress 6.6.1 Mysql 8 文章目录 1. 安装php2. 配置nginx2.1. 安装nginx2.2. 配置 3. 下载wordpress3.1. 配置wordpress 4. mysql配置wordpress数据库和用户4.1. 安装和远程连接4.2. 创建wordpre…

uart16550_ip_spec

用途&#xff1a;允许与调制解调器或其他外部设备进行通信&#xff0c;例如使用串行电缆和RS232协议的另一台计算机。 核心特性&#xff1a; WISHBONE接口&#xff1a;支持32位或8位数据总线模式&#xff08;可选&#xff09;。 FIFO操作&#xff1a;仅支持FIFO&#xff08;先…

惊爆!布偶猫喂养秘籍:希喂、交响乐金罐、尾巴生活适合布偶猫吗?

我家布偶甜美可爱&#xff0c;喜欢撒娇爱粘人&#xff0c;真的特别可爱。不过想养好布偶猫喂食非常重要&#xff0c;喂食方法不对&#xff0c;食物没选择好&#xff0c;都会影响布偶猫的健康与正常生长。今天我就就拿布偶猫的选粮标准来测评三款热门主食罐&#xff0c;让大家更…

基于JAVA的专利资源共享平台

项目介绍 基于JAVA的专利资源共享平台系统是一个集专利信息展示、资源共享、交易服务等功能于一体的综合性平台。该系统利用JAVA语言的强大功能和广泛的生态系统&#xff0c;结合数据库技术、Web开发技术等&#xff0c;为用户提供了一个高效、安全、便捷的专利资源共享和交易环…

天气分析预测系统-气象网

项目介绍 在信息科技蓬勃发展的当代&#xff0c;我们推出了一款基于Python Flask的全国上海气象数据采集、预测和可视化系统。随着气候变化越发引起全球关注&#xff0c;精准的气象数据和可视化展示变得愈发重要。该系统采用先进的技术和创新的功能&#xff0c;满足用户对实时…

html+css+js网页设计 个人博客模版 我的学习经历7个页面

htmlcssjs网页设计 个人博客模版 我的学习经历7个页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取…

npm登录

npm 登录 npm login --auth-typelegacy报错 原因 npm源非npm本身源&#xff0c;需要切换&#xff1a; 查看源 nrm ls切换为npm源 nrm use npm重新登录 输入OTP验证后登录成功&#xff1a;

包含结构体的类的大小

看一下简单的例子&#xff0c;一个类声明中包含了一个结构体的声明&#xff0c;在没有定义这个结构体变量的情况下&#xff1a; #include <stdlib.h> #include <stdio.h> #include <malloc.h>class CTest { public:CTest(){}~CTest() {}struct internal{in…

在AMD GPU上使用DBRX Instruct

DBRX Instruct on AMD GPUs — ROCm Blogs 在这篇博客中&#xff0c;我们展示了DBRX Instruct&#xff0c;这是由Databricks开发的一个专家混合大型语言模型&#xff0c;在支持ROCm的系统和AMD GPU上运行。 关于DBRX Instruct DBRX是一个基于Transformer的仅解码大型语言模型…

OpenCV绘图函数(8)填充凸多边形函数fillConvexPoly()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 填充一个凸多边形。 函数 cv::fillConvexPoly 绘制一个填充的凸多边形。这个函数比 fillPoly 函数快得多。它可以填充的不仅仅是凸多边形&#…

护眼台灯减蓝光和无蓝光的有区别?眼科医生推荐的护眼台灯

自从疫情以后&#xff0c;”网课“成了一个热门的课程&#xff0c;许多家长会为了孩子的学习进行网课的报名。孩子们的眼睛处于生长期比较脆弱&#xff0c;长时间对着手机&#xff0c;电脑上课&#xff0c;电子产品会产生蓝光&#xff0c;眼睛会受到一定的伤害。护眼台灯减蓝光…

CTFHub-SSRF过关攻略(持续更新中...)

第一题&#xff0c;内网访问 一&#xff0c;打开web/ssrf/内网访问 二&#xff0c;进入页面什么都没有查看一下上一步给的参数 三&#xff0c;输入http://127.0.0.1/flag.php回车显示flag 四&#xff0c;然后复制提交&#xff08;恭喜通关&#xff09; 第二题&#xff0c;伪协…

AI智能大数据分析足球AIAutoPrediction,提高足球比赛预测准确度的新方法

本文摘要&#xff1a;一、I智能大数据分析足球的原理I智能大数据分析足球的原理是利用机器学习和大数据分析技术&#xff0c;对足球比赛的各种数据进行分析和预测。这些数据包括球队历史成绩、球员数据、场地... 一、I智能大数据分析足球的原理 I智能大数据分析足球的原理是利…

视频生成类大模型实现原理以及应用和难点

“ 视频生成属于计算机视觉领域&#xff0c;还包括图像处理等 ” 生成式大模型在文本&#xff0c;图像&#xff0c;视频等方面表现良好&#xff0c;而我们都知道文本生成大模型是基于自然语言处理技术&#xff0c;而视频生成的大模型又是怎么实现的呢&#xff1f; 今天我们就…