设计模式-原型模式(Prototype)

C++设计模式——Prototype Pattern原型模式 原型模式是一种创建型设计模式,它允许通过克隆已有对象来创建新对象,从而无需调用显式的实例化过程。原型模式的设计,使得它可以创建一个与原型对象相同或类似的新对象,同时又可以减少对象实例化操作产生的性能开销,使得创建对象的操作更加便捷,它减少了大量不必要的重复工作,并提高了系统性能。当创建对象的操作比较复杂和耗时的时候,原型模式则提供了一个更加高效和简单的创建对象的模式,它可以更加快速的创建对象的副本,且不需要依赖对象的某些实例化步骤,它避免了使用传统的new关键字创建对象实例时的复杂构造过程。 阅读详情
  • Specify the kinds of objects to create using a prototypical instance,and create new objects bycopying this prototype.(用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。)简单说明就是不通过new关键字产生对象,而是通过对象复制来实现就叫做原型模式。

原型模式的核心就是一个clone()方法,通过该方法进行对象拷贝,java底层提供了一个Cloneable接口来标示这个对象是可拷贝的,这个借口只是一个标记作用,在JVM中有这个标记的对象才能被拷贝。

原型模式注意事项

1.构造函数不会被执行。我们举例说明为什么不会执行构造函数。

/**
 * @author shuliangzhao
 * @Title: Car
 * @ProjectName design-parent
 * @Description: TODO
 * @date 2019/5/31 22:57
 */
public class Car implements Cloneable{

    public Car() {
        System.out.println("我是一辆跑车...");
    }

    @Override
    public Car clone() {
        Car car = null;
        try{
            car = (Car)super.clone();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return car;
    }
}

客户端

/**
 * @author shuliangzhao
 * @Title: CarClient
 * @ProjectName design-parent
 * @Description: TODO
 * @date 2019/5/31 22:59
 */
public class CarClient {

    public static void main(String[] args) {
        Car car = new Car();
        Car clone = car.clone();
    }
}

运行结果

 

 

从运行结果我们可以看出只打印一句话 说明构造函数没执行。Object类的clone方法的原理是从内存中(具体地说就是堆内存)以二进制流的方式进行拷贝,重新分配一个内存块,那构造函数没有被执行也是非常正常的了。

浅拷贝和深拷贝

浅拷贝例子

/**
 * 浅拷贝
 * @author shuliangzhao
 * @Title: Thing
 * @ProjectName design-parent
 * @Description: TODO
 * @date 2019/5/31 22:26
 */
public class ShallowThing implements Cloneable {

    private List<String> list = new ArrayList<String>();

    @Override
    public ShallowThing clone() {
        ShallowThing thing = null;
        try {
            thing = (ShallowThing) super.clone();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return thing;
    }

    public void setList(String s) {
        this.list.add(s);
    }

    public List<String> getList() {
        return this.list;
    }


}

客户端Client

/**
 * @author shuliangzhao
 * @Title: Client
 * @ProjectName design-parent
 * @Description: TODO
 * @date 2019/5/31 22:30
 */
public class Client {

    public static void main(String[] args) {
        //浅拷贝
        ShallowThing thing = new ShallowThing();
        thing.setList("张三");
        ShallowThing clone = thing.clone();
        clone.setList("李四");
        System.out.println(thing.getList());
        //深拷贝
       /* DeepThing deepThing = new DeepThing();
        deepThing.setList("王五");
        DeepThing clone1 = deepThing.clone();
        clone1.setList("张柳");
        System.out.println(deepThing.getList());
        System.out.println(clone1.getList());*/
    }
}

执行结果

 

 

 

执行结果是两个,因为java做了一个偷懒的动作,clone方法只拷贝对象,对象内的数组和引用对象等都不拷贝,这就是浅拷贝。两个对象共享一个变量是一种非常不安全的方式。但是String字符串比较特殊,通过字符串池(stringpool)在需要的时候才在内存中创建新的字符串。所以使用String时候可以当做基本类型就可以。

深拷贝例子


/**
 * @author shuliangzhao
 * @Title: DeepThing
 * @ProjectName design-parent
 * @Description: TODO
 * @date 2019/5/31 22:32
 */
public class DeepThing implements Cloneable{

    private ArrayList<String> list = new ArrayList<String>();

    @Override
    public DeepThing clone() {
        DeepThing thing = null;
        try {
            thing = (DeepThing) super.clone();
            this.list = (ArrayList<String>)this.list.clone();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return thing;
    }

    public void setList(String s) {
        this.list.add(s);
    }

    public List<String> getList() {
        return this.list;
    }

}

客户端Client

/**
 * @author shuliangzhao
 * @Title: Client
 * @ProjectName design-parent
 * @Description: TODO
 * @date 2019/5/31 22:30
 */
public class Client {

    public static void main(String[] args) {
        //浅拷贝
        /*ShallowThing thing = new ShallowThing();
        thing.setList("张三");
        ShallowThing clone = thing.clone();
        clone.setList("李四");
        System.out.println(thing.getList());*/
        //深拷贝
        DeepThing deepThing = new DeepThing();
        deepThing.setList("王五");
        DeepThing clone1 = deepThing.clone();
        clone1.setList("张柳");
        System.out.println(deepThing.getList());
        System.out.println(clone1.getList());
    }
}

执行结果

 

 

从上图可以看出第一个执行结果只有一个值。这就是深拷贝。

原型模式优点

1.性能好,因为是二进制拷贝,比new一个对象性能好。
2.不依赖构造函数

莆田市C++专项选拔第一轮题4 现在小明同学想要从两堆硬币中各选择一枚硬币,使得两枚硬币的面值之和 不超过 k。不同的硬币组合,就算面值相同,也视为不同的方案。现在他把这些硬币分成了两堆,已知两堆硬币分别有 n 和 m 枚硬币。可选方案有: (1,2), (1,1), (1,1), (5,2), (5,1), (5,1),共 6 种。第一行三个整数 n, m, k,分别表示第一堆硬币的数量,第二堆硬币的数量,以及面值之和的上限。对于30%的数据,1 ≤ n , m ≤ 1000 , 1 ≤ b , c ≤ 1000。 阅读详情

相关推荐

无线通信入门:3种键控法(ASK/FSK/PSK)原理图解与实战对比

本文深入解析无线通信中ASK、FSK、PSK三种基础键控法的原理与应用。通过图解对比,阐明幅移键控(ASK)简单低成本但抗干扰差,频移键控(FSK)稳健且应用广泛,相移键控(PSK)高效但复杂。文章结合实战场景,为物联网和嵌入式开发者在选型时提供关键指导,帮助平衡数据速率、成本、功耗与抗干扰需求。

weixin_29274969的博客 188

java实现VEBTree原型

花了一周时间才想明白,稍后补上删除代码

chenzhichao的博客 571

PotPlayer 史诗级更新!实时字幕生成+实时翻译,看片真的无敌了!

potplayer已经更新实时字幕生成+实时字幕翻译功能

阿虚同学的博客 1万+

【prototype学习】基于prototype的tree(纯数据驱动OO)

rt: 给出代码和demo; 看到很多tree的实现,很少有数据驱动的,大部分都是一个js 的array或者xml文件作为数据源,参考dtree的功能写了这个树,特点提供了回调函数传回的是tree和选种node的引用,方便扩展,可以把简单的后台管理导航等都用js来搞定,目前样式部分没有处理,最后一个demo加以css样式控制可以做成menu。使用的最主要的技巧:是通过对外暴露的tree引用达到...

jianfeng008cn的专栏 209

医学图像配准实战:用Python实现MIND特征提取(附完整代码)

本文详细介绍了MIND(模态无关邻域描述符)在医学图像配准中的应用。通过Python和PyTorch实战,从原理到代码逐步解析了如何提取MIND特征,并利用其对结构而非灰度的感知能力,有效解决CT、MRI等多模态图像的对齐难题,为病灶追踪、手术导航等高级应用提供鲁棒性基础。

263

ubuntu17.04 UHD 驱动出错

ubuntu 17.04 源码安装UHD

xrh003的博客 1万+

《设计模式之禅》-原型模式注意事项-构造函数不会执行

一个实现了Cloneable并重写了clone方法的类,通过重写的clone 方式克隆出来的对象是不会执行构造函数的 public class Thing implements Cloneable{ public Thing(){ System.out.println("构造函数被执行了"); } @Override public Thing ...

Minstrel的博客 481

PX4从放弃到精通(十一):混控及PWM输出

文章目录前言一、混控脚本二、使用步骤1.引入库2.读入数据总结 前言 一个人可以走的更快,一群人才能走的更远,交流学习加qq:2096723956 更多保姆级PX4+ROS学习视频:https://b23.tv/ZeUDKqy 分享知识,传递正能量,如有疏漏或不当之处,恳请指出. 一、混控脚本 混控脚本定义了不同 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pand

超维空间科技的博客 1万+

设计模式-原型模式 Prototype Pattern

通常,如果需要快速复制对象并且对象的创建成本较高,或者需要创建多个相似但不完全相同的对象,原型模式是一个更好的选择。原型模式(Prototype Pattern)是一种创建型设计模式,它允许你通过复制现有的对象来创建新的实例,而不是通过新建的方式来构造。使用原型模式可以提高对象创建的效率,降低系统的资源消耗,并有助于实现对象的快速复制和灵活管理。然而,需要注意的是,原型模式可能会增加内存消耗,并且在处理包含引用类型成员的对象时需要特别小心,以避免浅拷贝导致的问题。

wesigj的博客 1699

数学之美:欣赏超越数e

文章目录一、e为何物?二、利息与e的关系1、利息问题2、计算利息3、欣赏螺旋线(1)螺旋线概述(2)绘制螺旋线三、e和π 一、e为何物? e是一个无限不循环小数,其值约等于2.718281828…,它是一个超越数,有时也称为欧拉数(Euler’s Number)。 以e为底的对数称为自然对数(Natural Logarithm),数学中使用自然这个词的还有自然数(Natural Number)。 这里的“自然”并不是现代人所习惯的“大自然”,而是有点儿“天然存在,非人为”的意思。 二、利息与e的关系

howard2005的专栏 1717

Labview界面多按钮控件的一种处理方法

当界面中存在多个按钮控件时候,此时如果逐个为每个控件添加事件条件则会显得较为麻烦,此处提供了一种对多控件进行批量处理的方法

miracleis的博客 2702

设计模式-04原型模式Prototype Pattern

原型模式是一种创建型设计模式,通过复制已有对象来创建新对象,避免代码依赖具体类。它适用于需要动态创建对象、减少类层次结构或避免重复初始化复杂对象的场景。实现方式包括浅克隆(仅复制基本类型和引用)和深克隆(递归复制所有引用对象),后者可通过序列化或手动实现。示例代码展示了文档对象的克隆,浅克隆会共享引用导致原始对象被修改,而深克隆则完全独立,确保对象状态的完整性。

d3y1`5 81_09 885

在 FreeStyle SAP UI5 应用里优雅落地 Draft 草稿机制:用 DraftManager 封装 DraftController 的一套实战套路

SAP Fiori应用中,Draft草稿机制是解决业务中断、多人协作和长表单填写等痛点的核心能力。本文提出了一套针对FreeStyle SAP UI5应用的Draft管理方案,通过封装sap.ui.generic.app.transaction.DraftController为DraftManager服务类,将复杂的草稿操作逻辑集中管理。该方案实现了草稿的创建、激活、丢弃等核心功能,使控制器只需调用简单意图式API即可完成操作,同时解决了组件化架构下的上下文切换、统一错误处理等问题。文章还详细介绍了后端Dr

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2751

23种设计模式之原型模式(Prototype Pattern)

本篇文章将23种设计模式中的单例设计模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

设计模式|原型模式(Prototype Pattern)

原型模式(Prototype Pattern)是一种创建型设计模式,其核心思想是通过复制现有对象来创建新对象,而无需显式地指定它们的类。这种模式通常用于当对象的创建成本较高,或者对象初始化过程比较复杂时。

weixin_44435110的博客 1420

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

设计模式之原型模式(Prototype Design Pattern)

原型模式,可以理解为克隆模式,就是对一个已创建的对象进行克隆。这个对象必须提供克隆的方法。 我们先看一个简单的例子: //实现Cloneable ,重写clone方法,使用对象提供克隆的能力 public class Article implements Cloneable { public Article(){ System.out.println("初始化"); } public Article clone() { System.out.

xjj1314的专栏 330

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java设计模式 六 原型模式 (Prototype Pattern)

原型模式是解决对象重复创建问题的强大工具,特别适合那些创建成本高或需要快速生成对象的场景。根据具体需求,可以选择浅拷贝或深拷贝的实现方式。尽管实现上可能会稍复杂,但它提供了灵活性和高效性,是值得掌握的重要设计模式之一。

空 1117

C++设计模式——原型模式(Prototype Pattern)

C++设计模式——原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——原型模式(Prototype Pattern)目录定义代码示例普通指针方式实现智能指针方式实现总结为什么需要原型模式优缺点 定义 Specify the kinds of Objects to create using a prototypical instance, and create new objects by copying this prototype. 用原型实例指

leonardohaig的博客 1636

原型模式(Prototype Design Pattern)及代码实现

什么是 原型模式? 原型模式 指 把一个通过类 示例化后的 对象作为 原型,对此原型 进行 复制,得到一个新的对象,这个新对象 和原型 的 属性等完全相同,并且 用户 可以在此新对象 基础上 进行改变(新增或修改属性); 现实生活中的例子: 1.克隆羊 多莉,对 原有 羊 进行克隆 后 得到一个 完全相同的 新对象(多莉); 2.书籍的 不同版本; 在第一版书籍 出版后,发现一些问题, 需要出版第二版,这时 作者 不会从头开始 一页一页的 写书等等, 作者会在第一版的 进行克隆 生成 第二版..

rgc_520_zyl的博客 579

秒懂设计模式之原型模式(Prototype Pattern)

概述 原型模式属于创建型模式,所以它是描述如何创建对象的模式。顾名思义, 先搞一个原型对象出来,然后在这个原型对象的基础上修修补补弄出一个新对象来。 使用场景 当一个对象的构建代价过高时。例如某个对象里面的数据需要访问数据库才能拿到,而我们要多次构建这样的对象。 当构建的多个对象,均需要某种原始状态时,就可以使用原型对象保存这种原始状态,其他对象基于原型对象来修改。 《江城子·密州出猎》 ----------------------------------------------------------

ShuSheng007的程序人生 7466

设计模式之原型模式(Prototype Pattern)

意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。主要解决:在运行期建立和删除原型。何时使用:1、当一个系统应该独立于它的产品创建,构成和表示时。2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。3、为了避免创建一个与产品类层次平行的工厂类层次时。4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。如何解决:利用已有的一个原型对象,快速地生成和原型对象一样的实例。

weixin_42294716的博客 859

【设计模式】原型模式(Prototype Pattern)详解

摘要: 原型模式通过复制已有对象(原型)来创建新对象,避免重复初始化带来的性能开销。核心思想是“拷贝”而非重新构造,适用于创建成本高、对象差异小的场景。Java通过Cloneable接口支持原型模式,但需注意浅拷贝(仅复制对象本身)与深拷贝(复制对象及引用对象)的区别。优点包括提高性能、简化创建过程,缺点在于实现复杂且可能破坏封装性。典型应用包括Spring的prototype作用域、游戏角色复制等。使用时应权衡对象创建成本,避免过度设计。

经天纬地,格物致理 922

23种设计模式——原型模式 (Prototype Pattern)详解

本文介绍了23种经典设计模式之——原型模式 (Prototype Pattern)的说明及使用

Meteors.的博客 1001

Java设计模式——原型模式【ProtoType Pattern】

Java设计模式、原型模式

scorpio的博客 495

设计模式(Design pattern)之原型模式(Prototype Pattern)

摘要:原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复初始化开销。文章展示了Java实现原型模式的两种方式:浅复制(Shallow Copy)仅复制基本类型字段,而深复制(Deep Copy)通过序列化机制完整复制对象及其引用对象。代码示例包含毕业证案例,演示了如何实现Cloneable接口进行浅复制,以及通过对象序列化实现深复制。深复制通过将对象写入文件再读取的方式,确保所有引用对象都被完整复制,解决了浅复制中引用对象共享的问题。

RR1335 之代码才是动力源 235

Java 设计模式——原型模式(Prototype Pattern)

Java 设计模式——原型模式(Prototype Pattern) 一.基础概念 1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 2.主要概念 Java中的克隆方法: 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝 二: 具体实现 1.浅...

a158s168的博客 457
上一篇: 设计模式-代理模式
下一篇: ThreadLocal原理及用法详解
境里婆娑
境里婆娑 新星创作者: Java技术领域 新星创作者: Java技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄10年 1万+粉丝 300原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

境里婆娑

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

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

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

打赏作者

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

抵扣说明:

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

余额充值