对象创建型模式:原型模式

原型模式:高效克隆对象的创建型设计模式详解 在软件工程中,创建型设计模式关注如何高效、灵活地实例化对象。原型模式(Prototype Pattern)作为一种核心创建型模式,其原理是通过复制现有实例(原型)来生成新对象,而非传统地调用构造函数。这一机制在对象创建成本高昂(如涉及复杂初始化、数据库查询或资源加载)或系统需在运行时动态确定对象类型时,展现出显著的技术价值。它尤其适用于需要批量生成相似对象(如游戏中的单位、图形编辑器中的元素)或配置模板复用的场景。理解浅拷贝与深拷贝的区别是实现该模式的关键,不同编程语言(如Java、C++、Python)对 阅读详情

前言

本文章根据刘伟(Sunny) 的设计模式一书记录的笔记,感谢作者的知识分享。

定义

原型模式(Prototype Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。

  • 1.在原型模式结构图中包含如下几个角色:
    • Prototype(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至还可以是具体实现类。
    • ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
    • Client(客户类):让一个原型对象克隆自身从而创建一个新的对象,在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。由于客户类针对抽象原型类Prototype编程,因此用户可以根据需要选择具体原型类,系统具有较好的可扩展性,增加或更换具体原型类都很方便。
  • 2.两个克隆的概念
    • 浅克隆:如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。
    • 深克隆:无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。(可以通过多层浅克隆实现,或者通过序列化实现)

实现

//工作周报WeeklyLog:具体原型类,考虑到代码的可读性和易理解性,只列出部分与模式相关的核心代码
class WeeklyLog implements Cloneable
{
       private  String name;
       private  String date;
       private  String content;
       public  void setName(String name) {
              this.name  = name;
       }
       public  void setDate(String date) {
              this.date  = date;
       }
       public  void setContent(String content) {
              this.content  = content;
       }
       public  String getName() {
              return  (this.name);
       }
       public  String getDate() {
              return  (this.date);
       }
       public  String getContent() {
              return  (this.content);
       }
     //克隆方法clone(),此处使用Java语言提供的克隆机制
       public WeeklyLog clone()
       {
              Object obj = null;
              try
              {
                     obj = super.clone();
                     return (WeeklyLog)obj;     
              }
              catch(CloneNotSupportedException e)
              {
                     System.out.println("不支持复制!");
                     return null;
              }
       }
}

class Client
{
       public  static void main(String args[])
       {
              WeeklyLog log_previous = new WeeklyLog();  //创建原型对象
              log_previous.setName("张无忌");
              log_previous.setDate("第12周");
              log_previous.setContent("这周工作很忙,每天加班!");

              System.out.println("****周报****");
              System.out.println("周次:" +  log_previous.getDate());
              System.out.println("姓名:" +  log_previous.getName());
              System.out.println("内容:" +  log_previous.getContent());
              System.out.println("--------------------------------");

              WeeklyLog  log_new;
              log_new  = log_previous.clone(); //调用克隆方法创建克隆对象
              log_new.setDate("第13周");
              System.out.println("****周报****");
              System.out.println("周次:" + log_new.getDate());
              System.out.println("姓名:" + log_new.getName());
              System.out.println("内容:" + log_new.getContent());
       }
}

//打印
****周报****
周次:第12周
姓名:张无忌
内容:这周工作很忙,每天加班!
--------------------------------
****周报****
周次:第13周
姓名:张无忌
内容:这周工作很忙,每天加班!

注意:实现对象克隆的类必须实现Cloneable接口,否则会抛出异常CloneNotSupportedException.

总结

  • 1.优点
    • 原型模式的主要优点如下:
      • (1) 当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过复制一个已有实例可以提高新实例的创建效率。
      • (2) 扩展性较好,由于在原型模式中提供了抽象原型类,在客户端可以针对抽象原型类进行编程,而将具体原型类写在配置文件中,增加或减少产品类对原有系统都没有任何影响。
      • (3) 原型模式提供了简化的创建结构,工厂方法模式常常需要有一个与产品类等级结构相同的工厂等级结构,而原型模式就不需要这样,原型模式中产品的复制是通过封装在原型类中的克隆方法实现的,无须专门的工厂类来创建产品。
      • (4) 可以使用深克隆的方式保存对象的状态,使用原型模式将对象复制一份并将其状态保存起来,以便在需要的时候使用(如恢复到某一历史状态),可辅助实现撤销操作。
  • 2.缺点
    • 原型模式的主要缺点如下:
      • (1) 需要为每一个类配备一个克隆方法,而且该克隆方法位于一个类的内部,当对已有的类进行改造时,需要修改源代码,违背了“开闭原则”。
      • (2) 在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重的嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来可能会比较麻烦。
  • 3.适用场景
    • 在以下情况下可以考虑使用原型模式:
      • (1) 创建新对象成本较大(如初始化需要占用较长的时间,占用太多的CPU资源或网络资源),新的对象可以通过原型模式对已有对象进行复制来获得,如果是相似对象,则可以对其成员变量稍作修改。
      • (2) 如果系统要保存对象的状态,而对象的状态变化很小,或者对象本身占用内存较少时,可以使用原型模式配合备忘录模式来实现。
      • (3) 需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比使用构造函数创建一个新实例更加方便。
编程自学指南:java程序设计开发,设计思想开源框架-创建型模式之原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 ​ java程序设计开发,设计思想开源框架-创建型模式之原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需知道对象的具体创建细节。该模式使用克隆机制,以一个原型对象为基础,通过复制的方式创建新对象,从而提高对象创建的效率。 ​ 阅读详情

相关推荐

第四章:对象创建型模式之原型模式

原型模式是指通过原型实例指定要创建对象的类型,并通过拷贝原型实例创建新对象。原型模式之创建型设计模式,它提供一种创建对象的最佳实践。拷贝即clone(克隆),分为浅拷贝和深拷贝两种。浅拷贝:创建一个对象,新对象的属性和原对象完全相同,对于非基本类型对象,新对象的数据的引用仍指向原对象的属性引用指向的内存地址。简单来说,浅拷贝只克隆原对象本身和其包含的非引用类型属性,引用类型属性克隆。深拷贝:创建一个对象,新对象的属性也会被拷贝,不在指向原有的对象地址。

一只猫的博客 1082

原型模式 - 对象创建

原型模式是用于创建重复的对象,同时又能保证性能。原型是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。 1. 介绍 意图:原型指定创建对象的种类,并通过拷贝这些原型创建新的对象。 主要解决:在运行期建立和删除原型。 何时使用:1、当一个系统应该独立于他的产品光剑,构成和表示时。2、当要实例化的类是在运行时刻

生活需要深度 385

Python 程序语言设计模式思路-创建型模式:原型模式:通过复制现有对象来创建新对象,面向对象编程

原型模式在通过复制现有对象来创建新对象方面具有显著的优势,尤其在对象初始化成本高、需要保留对象状态以及避免复杂构造函数调用的场景中表现出色。因此,在实际应用中,应根据具体需求权衡利弊,合理使用原型模式,以充分发挥其优势,避免其不足对系统造成影响。原型模式(Prototype Pattern)作为创建型模式的一种,通过复制现有对象来创建新对象,从而避免了使用构造函数直接实例化对象的过程。本文将探讨Python中的原型模式,介绍其应用领域,提供代码实例及详解,并分析其优缺点,最终得出结论。

Andy 880

创建对象之原型模式

原型模式 我们创建的每个函数都有一个 prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。如果按照字面意思来理解,那么 prototype就是通过调用构造函数而创建的那个对象实例的原型对象。使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法。换句话说,不必在构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中,如下面的例子所示。 // 原型模式 function Person4(){ } Person

qq_45371853的博客 249

版电力系统故障录波_故障录波识图与典型故障波形分析

1、设置故障录波的目的故障录波装置是对电力系统运行状况进行监控的一种自动化设备。系统正常运行时,录波装置不启动录波,当系统发生故障时,通过启动录波装置迅速启动录波器录波,直接记录反应故障装置安装处系统故障的电气量。2、故障录波的作用(1)正确评价继电保护和自动装置的工作。(2)正确分析事故的原因并研究防止对侧。(3)发现继电保护和自动装置缺陷。(4)发现一次设备缺陷,及时消除隐患。(5)帮助寻找故...

weixin_42495661的博客 1万+

ISP Tuning实战指南:从基础到高级的色彩与亮度优化

本文详细介绍了ISP Tuning的基础概念与高级调优技术,包括黑电平校正(BLC)、自动白平衡(AWB)、色彩校正矩阵(CCM)和Gamma曲线调整等核心算法。通过实战案例和调试技巧,帮助工程师提升摄像头成像质量,解决高光过曝、暗部噪点等常见问题,适用于智能门铃、车载摄像头等多种场景。

weixin_30879169的博客 107

JavaScript 创建对象 (工厂模式、构造函数模式、原型模式、组合使用构造函数模式与原型模式)

世界上只有一种真正的英雄主义就是在认清生活真相之后仍然热爱它一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

m0_60707660的博客 799

【AI概念】迁移学习 vs. 域自适应 vs. 域泛化|定义、核心原理、数学表达、易混淆点与工程选择建议|实际案例、工程实现细节、未来研究趋势、实际应用场景

大家好,我是爱酱。本篇将会详细梳理迁移学习(Transfer Learning)、域自适应(Domain Adaptation)、域泛化(Domain Generalization)三大常被混淆的核心概念,结合数学公式、典型算法与实际应用场景,帮助你厘清它们的本质区别、联系与工程意义。 注:本文章含大量数学算式、详细例子说明及大量代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!

AI人工智能爱酱~你的AI学习好帮手~ 2466

原型模式的使用分析

原型模式是一种简单、易使用的创建型设计模式,通过给出一个原型对象来指明所创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。原型模式要求对象实现一个可以“克隆”自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例。这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再去通过new来创建

AlexWong的专栏 4080

【应用】OpenClaw玩转有道云笔记

功能名称核心原理实操示例(直接复制可用)实操避坑+补充说明网页剪藏插件自动抓取网页正文、下载图片,通过 API 发送到你的有道云笔记,内联图片避免防盗链失效帮我把这个网页剪藏到云笔记:https://example.com/article1. 避坑:知乎、公众号等需登录的网站,先在浏览器登录再剪藏;2. 原理:自动过滤广告,只留正文;3. Twitter/X 剪藏需额外配置 APIFY_API_TOKEN(见1.2.4)创建笔记。

海兰 712

App 抓包难?Frida Hook 实战:绕过 SSL Pinning (证书绑定) 抓取某大厂 App 核心接口

当我们使用 Charles 抓包 HTTPS 时,本质上是实施了MITM(中间人攻击)。Charles 伪装成服务器,发给 App 一个自己的证书(伪造证书)。Charles 伪装成 App,拿着真正的证书去请求服务器。如果 App 只是简单校验“证书是否由受信任的 CA 签发”,那你把 Charles 的根证书安装到手机系统里,就能骗过它。但是,是 App 内置了服务器证书的Hash(指纹)。

BUG猿的博客 914

设计模式:原型模式与享元模式

一、原型模式 原型模式是通过给出一个原型对象来指明所创建的对象的类型,然后使用自身实现的克隆接口来复制这个原型对象,该模式就是用这种方式来创建出更多同类型的对象 原型模式是在内存二进制流的拷贝,要被直接new一个对象性能好很多,特别是要在一个循环体内产生大量的对象时,原型模式可以更好地体现其优点 1、实现原型模式 //实现Cloneable接口的原型抽象类Prototype public clas...

hxt的博客 3500

「深度学习之优化算法」笔记(二)优化算法的分类

但是由于生物的局限性,人们所创造出的算法也会有局限性:我们所熟知的生物都生存在三维空间,在这些环境中,影响生物生存的条件比较有限,反应到算法中就是这些算法在解决较低维度的问题时效果很好,当遇到超高维(维度>500)问题时,结果可能不容乐观,没做过实验,我也不敢乱说。当然,他们的目的不是在最佳狩猎位置集合,他们的目的是在过去的途中看是否能发现更加好的狩猎位置,去往已经到过的狩猎地点再次狩猎是没有意义的,因为每个位置获取食物的难易程度是固定的。如果他们的策略是“不跟随最优解”,那么他们的策略是什么呢?

quanzhan_King的博客 1371

设计模式五:Prototype原型模式——对象创建型模式

Prototype原型模式——对象创建型模式 1.意图用原型示例制定创建对象的种类,并且通过拷贝这些原型创建新的对象。“创建一个对象,用一个原型指定它的种类,拷贝只是一种手法,不是目的。” 2.适用性当一个系统应独立于它的产品创建、构成和表示时要用prototype模式要实例化的类在运行时刻指定的为了避免创建一个与产品类层次平行的工厂类层次时当一个类的实例只能有几个不同状态组合中的一种时。建立...

weixin_30478619的博客 98

某东详情页h5st 算法分析

某东详情页h5st 算法分析

自成背后的博客 1万+

金融领域必备:Python爬虫+AI量化分析,爬取股票数据并实现智能交易策略

本文通过Python爬虫+AI量化分析的组合,实现了从股票数据爬取到智能交易策略的全流程。免费获取全维度金融数据(行情、财务、舆情),替代付费终端;用LSTM模型捕捉股价的时间序列规律,提升预测精度;基于Backtrader实现策略回测与优化,保证策略的有效性。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1371

原型模式(Prototype Pattern)

原型模式是一种创建型设计模式,其核心思想是通过复制现有对象来创建新对象,而不是通过实例化类来创建对象。这种方式可以在不知道具体对象类型的情况下创建新的实例,同时还能够避免耦合性,使得系统更灵活。

weixin_40026739的博客 634

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

设计模式(四):创建型之原型模式

用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。

从基础到源码解析的学习记录 1009

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

设计模式—创建型模式

设计模式设计模式的分类一、创建者模式1、工厂模式1.1、简单工厂模式1.2、工厂方法模式1.3、抽象工厂模式1.4、三种工厂模式的使用选择2、单例模式2.1、预加载(饿汉式)2.2、懒加载(懒汉式)2.3、线程安全的懒加载(双重检查锁)3、生成器模式3.1、生成器模式的结构3.2、实例和代码分析 设计模式的分类 一、创建者模式 1、工厂模式 1.1、简单工厂模式 定义: 定义了一个 创建对象的类,这个类封装了实例化对象的行为。 代码示例: #include <iostream> using

qq_36721032的博客 412

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

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

原型模式

一、原型模式的概念 原型模式是创建型模式,通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例 被复制的实例就是我们所称的“原型”,这个原型是可定制的 客户端(Client):提出创建对象的请求 抽象原型(Prototype):一个Java接口或Java抽象类,此角色给出所有的具体原型类所需的接口 具体原型(ConcretePrototype):被复制的对象 二、...

QPee和吉他 276

设计模式:原型模式

首先,我们先考虑这样的一个问题,如果我们需要获取与某一个对象相同类型的对象,但我们不知道该对象是什么类型的,工厂方法能满足我们吗?回答是能,但要存储额外信息,及在该对象的抽象中增加一个能够证明该对象类型的信息的接口,例如枚举类型,但有时我们不想这样弄,那么有没有什么更好的方法呢?有,我们可以在对象的抽象中增加一个类似于Clone的接口,这样我们就可以实现不知道对象的类型也能创建与该对象相同类型的对象了,这就是原型模式,即:将创建对象的责任给该对象。...

weixin_62953519的博客 654

Java 设计模式・原型模式篇:从思想到代码实现

摘要:本文系统介绍了Java创建型设计模式中的原型模式实现。通过对比赋值、浅克隆和深克隆三种对象复制方式,详细分析了它们在内存地址、基本类型和引用类型处理上的差异。文章提供了用户和地址类的代码示例,演示了浅克隆(实现Cloneable接口)和深克隆(手动递归重写clone()方法和序列化方式)的具体实现方法,并通过测试案例验证了不同克隆方式的行为特性。最后简要提及其他创建型模式(单例、工厂、建造者模式)的参考资源,为Java开发者提供了一套完整的对象创建解决方案。

l7_yuqi的博客 1000

体系结构:创建型模式解析

简单工厂与工厂与抽象工厂的区别 共同点:都是为了解决不同接口需要调用不同的实例。 区别: 1)简单工厂模式:工厂和产品之间是一对多的关系,根据不同的条件,可以创建不同的实例问题。 2)工厂模式:工厂和产品之间是一对一的关系。 3)抽象工厂模式:工厂和产品之间是多对多的关系。 ...

qq_44444107的博客 173

创建型模式(单例模式+工厂模式+建造者模式+原型模式)

靠谱盘点92:春决重演!Tes京东再次会师决赛,Uzi:我同意阿水就是第一AD

persistenthuang 1033

用一个例子说明五种创建型设计模式

将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。分离了部件的构造(由Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况。由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。

2401_83384536的博客 727

1原型模式,构建者模式

文章目录1 创建型:1.1 简单工厂,工厂方法,抽象工厂1.4原型模式(copy)1.5构建者模式 1 创建型: 为什么会使用创建型设计模式那? 1 因为我们只是想使用对象,不是为了去创建对象 2 创建对象的细节有时候复杂或者是隐蔽的,对于使用者来说,要了解对象的创建细节是比较痛苦且没有必要的 1.1 简单工厂,工厂方法,抽象工厂 1.4原型模式(copy) 作用: 就是给我一个原型,我给你一个...

Insist___的博客 263
上一篇: 对象创建型模式:单例设计模式
下一篇: 对象创建模式:建造者模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝多芬也爱敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值