(4)设计模式之原型模式(创建型模式)

从前端视角看设计模式之创建型模式篇 "设计模式"源于GOF(四人帮)合著出版的《设计模式:可复用的面向对象软件元素》,该书第一次完整科普了软件开发中设计模式的概念,他们提出的设计模式主要是基于以下的面向对象设计原则: - 对接口编程而不是对实现编程 - 优先使用对象组合而不是继承 阅读详情

声明:以下都是博主浅薄的经验之谈,欢迎大家学习交流

  • 原型模式分为两种
    浅度克隆
    深度克隆

引入克隆模式的介绍

public class MainClass {
    public static void main(String[] args) {
    /***引入克隆模式的介绍****/
    /**当创建两个类似person对象的时候,属性中只有名字发生了改变其他的属性没有改变的情况下,以下代码就可以进行优化**/
        Person p1 = new Person();
        p1.setAge(12);
        p1.setName("张某将");
        p1.setSex("男");
        Person p2 = new Person();
        p2.setAge(12);
        p2.setName("张金福");
        p2.setSex("男");
        }
}

浅度克隆

  • Person.java
public class Person implements Cloneable {
    private String name;
    private int age;
    private String sex;
    private List<String> friends;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public List<String> getFriends() {
        return friends;
    }

    public void setFriends(List<String> friends) {
        this.friends = friends;
    }
    public Person clone() {
        try {
            return (Person)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", sex=" + sex + ", friends=" + friends + "]";
    }
  • MainClass.java
public class MainClass {
    public static void main(String[] args) {
        /**1.克隆模式(浅度克隆)***/
        /**如果对象的属性属于引用变量类型,那么只进行地址的克隆(除去String类型) **/
        /**也就是说对p4 的List<String> friends;的变量值进行改变,那么 p3的List<String> friends 也会改变**/
        List<String> friends = new ArrayList<>();
        friends.add("八戒程序猿");
        friends.add("Kobe");
        Person p3 = new Person();
        p3.setAge(12);
        p3.setName("张xx");
        p3.setSex("男");
        p3.setFriends(friends);
        Person p4 = p3.clone();
        p3.setAge(14);//修改p3年龄
        p3.getFriends().add("Jmes");
        p4.setName("张金福");

    }

深度克隆

public class Person implements Cloneable {
    private String name;
    private int age;
    private String sex;
    private List<String> friends;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public List<String> getFriends() {
        return friends;
    }

    public void setFriends(List<String> friends) {
        this.friends = friends;
    }

    public Person clone() {
        try {
            Person clone = (Person) super.clone();
            List<String> newFriends = new ArrayList<>();
            for (String friend : this.friends) {
                newFriends.add(friend);
            }
            clone.setFriends(newFriends);
            return clone;
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", sex=" + sex + ", friends=" + friends + "]";
    }
  • MainClass.java
public class MainClass {
    public static void main(String[] args) {
        /**深度度克隆)***/
        /**此方式属于深度的克隆,对于该对象类变量属于引用变量类型的也进行复制(也就是说重新开辟一块内存堆)**/
        List<String> friends = new ArrayList<>();
        friends.add("八戒程序猿");
        friends.add("Kobe");
        Person p3 = new Person();
        p3.setAge(12);
        p3.setName("张xx");
        p3.setSex("男");
        p3.setFriends(friends);

        Person p4 = p3.clone();
        p3.setAge(14);//修改p3年龄
        p3.getFriends().add("Jmes");
        p4.setName("张金福");
        System.out.println("p3 对象" + p3);
        System.out.println("p4 对象" + p4);
    }
}
设计模式-创建型模式 目的:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。应用场景:GUI工具包中,为不同的操作系统提供统一的界面元素创建机制。描述:提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。核心思想:通过定义一个抽象层来创建一系列产品,而不是单一的产品。客户端代码使用的是由抽象工厂提供的接口,而不直接依赖于具体的产品类。优点:易于交换“系列产品”,因为具体工厂类在运行时被实例化;为大规模的产品设计提供了开放式的兼容性。// 抽象产品A// 具体产品A1。 阅读详情

相关推荐

【设计模式】-创建型模式-第2章第4讲-【原型模式】

Java 中原型模式究竟是个啥?这篇文章通俗易懂,带你2分钟搞定原型模式。

跟着飞哥学编程(全栈联盟) 1223

(一)创建型设计模式:4、原型模式(Prototype Pattern)

介绍原型模式的含义,以及用C++实现简单的原型模式的示例。

bigger_belief的博客 793

设计模式(四)原型模式Prototype(创建型)

设计模式(四)原型模式Prototype 1. 概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象。 例子1:孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来。 例.....................

黄规速博客:学如逆水行舟,不进则退 2万+

4-设计模式之创建型模式【原型模式、建造者模式】

设计模式之创建型模式【原型模式、建造者模式】1.4 原型模式1.4.1 概述1.4.2 结构1.4.3 实现1.4.4 案例1.4.5 使用场景1.4.6 扩展(深克隆)1.5 建造者模式1.5.1 概述1.5.2 结构1.5.3 实例1.5.4 优缺点1.5.5 使用场景1.5.6 模式扩展1.6 创建者模式对比1.6.1 工厂方法模式VS建造者模式1.6.2 抽象工厂模式VS建造者模式 1.4 原型模式 1.4.1 概述 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象

weixin_52448922的博客 534

Java创建型设计模式-原型模式

原型模式是一种创建型设计模式,‌它允许通过复制一个已经存在的对象来创建一个新的对象,‌而无需重新实例化。‌这种模式特别适用于那些需要创建类似对象的情况,‌可以避免重复的代码和资源浪费。‌原型模式的核心在于提供一个原型对象,‌通过这个原型对象来生成其他对象,‌而不需要知道这些对象的类结构。‌在本文,我们学习了Java的一种创建型设计模式原型模式,知道它拥有原型接口具体原型类客户端和克隆方法四个角色,还阐述了原型模式的使用场景,以及呈现了原型模式的代码示例,相信大家应该对原型模式不陌生了!!

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 1526

window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm)

文章目录一、卸载node二、安装nvm三、配置路径和下载源四、使用nvm安装node五、nvm常用命令六、卸载nvm七、遇到的问题 nvm 全名 node.js version management,顾名思义是一个nodejs的版本管理工具。通过它可以安装和切换不同版本的nodejs。 一、卸载node 如果你已经安装了node,那么你需要先卸载node,如果你没有安装那直接跳过这一步到下一步。 打开控制面板 -> 打开程序和功能 -> 右上角搜索输入node -> 右键卸载 为了确保彻底

HuangsTing的博客 41万+

GOF23设计模式-创建型模式4-原型模式

设计模式GOF23-原型模式思考原型模式原型模式实现克隆绵羊多利(浅拷贝)克隆绵羊多利(深拷贝)利用序列化和反序列化技术实现深克隆何时使用?测试new与clone创建对象效率 思考 克隆技术是怎么样一个过程? JavaScript语言中,继承怎么实现? 原型模式 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。 java中的克隆技术,就是以某个对象为原型,复制出新的对...

Tumbler 432

无人机飞控算法开发实战:从零到一构建企业级飞控系统

本文系统介绍了无人机飞控算法开发的完整流程,包括飞行动力学模型建立、传感器校准与数据融合、主流控制算法实现(PID、ADRC、EKF)以及企业级飞控系统架构设计。通过结合开源飞控框架(如PX4)和实际工程经验,提供了完整的代码实现示例,帮助学者从零开始掌握无人机飞控开发的核心技术。文中详细讲解了四旋翼无人机的动力学模型、传感器校准方法、EKF状态估计算法、PID和ADRC控制算法的实现,以及MAVLink通信协议的集成。最后,总结了完整的飞控系统开发流程和未来发展趋势。

全栈 3402

创建型设计模式(4):原型模式

原型模式1.复制引用、复制对象、浅拷贝和深拷贝复制引用复制对象浅拷贝和深拷贝2.代码实现简单深拷贝是否做到完全深拷贝真正深拷贝3.通过序列化和反序列化实现深拷贝4.使用场景5.优缺点 类和对象的关系好比模具和构件的关系,对象总是通过构造方法从类中创建的。 但是某些场景下是不允许类的调用者直接调用构造函数,也就说对象未必需要从类中衍生出来,现实生活中存在太多案例是通过直接 “克隆” 来产生新的对象,...

Jakob_Hu的博客 549

基于STM32的智能水温控制系统设计

智能水温控制系统广泛应用于家庭、工业、农业等多个场景,尤其在热水器、恒温泳池和地暖系统中,通过实时监测和调节水温,提高设备的效率和用户的舒适度。本文基于STM32微控制器设计了一个智能水温控制系统,能够实时监测水温、用户设置温度,并根据需要控制加热器或冷却装置,确保水温维持在设定范围内。系统能够根据用户设定自动控制加热和冷却设备,确保水温维持在舒适的范围内,并通过OLED屏实时显示水温信息。在生成的项目基础上,编写水温监测、目标温度设定、加热器和冷却装置控制、OLED数据显示以及超温报警的代码。

2401_88410555的博客 2475

Ubuntu关闭更新提醒的三层控制方法:从GUI到APT配置

Linux系统更新机制本质上是包管理器(APT)驱动的自动化运维流程,其核心原理在于分离‘元数据刷新’、‘安全补丁安装’和‘用户通知’三个职能。这种分层设计既保障了基础安全性,又为系统管理员提供了策略定制空间。技术价值体现在提升生产环境稳定性、规避未经验证的内核/驱动升级风险,并支持ROS、Blender渲染、工业控制等对时序敏感的应用场景。本文聚焦Ubuntu系统入门教程中高频需求——科学关闭软件更新提醒,覆盖Ubuntu 20.04及LTS版本的GUI设置、systemd服务禁用与APT配置修改三大实操

weixin_29698641的博客 394

设计模式(4) - 创建型模式 - 原型模式

文章目录1. 原型模式概述1.1 什么是原型模式1.2 原型模式使用的场景2. 什么是深克隆、浅克隆2.1 浅克隆概念2.2 深克隆概念3. 浅克隆实现3.1 克隆对象代码3.2 调用代码(解释在代码中)4. 深克隆实现4.1 克隆对象代码4.2 调用代码(解释在代码中)5. 总结 1. 原型模式概述 1.1 什么是原型模式 原型模式是指 原型实例指定创建对象的种类,并通过拷贝这些原型创建新的原型(说白了就是将一个对象复制一份) 1.2 原型模式使用的场景 类的初始化的时候,消耗的资源太多 new 构

immort.L 的博客 224

Exchange 2013/2016/2019修改附件大小限制

Exchange 2013/2016/2019邮件大小限制 可以在三个位置上配置Exchange上的默认邮件大小限制: 组织传输设置 发送/接收连接器设置 用户邮箱设置 1.打开Exchange Management Shell 使用命令查看默认限制 get-transportconfig | ft maxsendsize, maxreceivesize get-receiveconnector | ft name, maxmessagesize get-sendconnector | ft

高级基础架构专家-Hunter 6099

设计模式4:原型模式【创建型】

#include <iostream> using namespace std; // class CResume { public: CResume(const char* pName) { if(NULL == pName) { m_pName = new char[1]; m_pName[0] = '\0'; } else { m_...

kanguolaikanguolaik的专栏 551

一周一个Unity小游戏2D反弹球游戏 - 球反弹的方向

本文将实现当球在球板上反弹时,会根据球板移动的方向来给球施加反弹的力,例如当球板往左移动时反弹球,则球应向左上方反弹,若球板往右移动时反弹球,则球应向右上方反弹。

Giver的博客 752

FPGA实践教程: 使用HLS将C程序生成IP核心进行FPGA开发

请根据您使用的FPGA开发板和供应商选择适当的HLS工具,并按照他们的安装指南进行安装。根据您使用的FPGA开发板和供应商选择适当的HLS工具,并按照他们的安装指南进行安装。通过本教程,您了解了如何使用HLS工具将C程序生成IP核心,并将其用于FPGA开发。在HLS项目中,您可以对C程序进行设计和优化,以生成对应的IP核心。在HLS项目中,您可以对C程序进行设计和优化,以生成相应的IP核心。将导出的IP核心导入到FPGA项目中。使用FPGA开发环境的菜单中的"导入"或"添加文件"选项导入IP核心。

CqpFsharp的博客 455

理解设计模式——创建型模式(4)原型模式

原型模式 原型模式结构: “原型”接口 -->(声明克隆方法) 一个“原型”对象 --> 原型模式特点: 又叫作“克隆(clone)模式”,原型(被复制者)是一个支持克隆的对象。

dustinqi的博客 196

通过python+openCV实现对图片中箭头方向的判断

摘要: 针对YOLOv8算法在箭头方向识别效果不佳的问题,提出了一种基于OpenCV的解决方案。该方法通过图像预处理、轮廓分析、几何特征提取(凸包、质心、外接矩形)和方向向量计算,准确判断箭头的上下左右方向。代码示例展示了从图像读取到方向识别的完整流程,并提供了优化建议(如调整二值化阈值、处理多轮廓)。该方案在Windows11+Python3.12+OpenCV环境下验证有效,适用于需要简单几何特征分析的箭头方向检测场景。

AnChenliang_1002的博客 702

JAVA SCRIPT设计模式--创建型设计模式之原型模式(4)

我们可以为每一种音乐对象创建一个GraphicTool的子类,但这样会产生大量的子类,这些子类仅仅在它们所初始化的音乐对象的类别上有所不同。解决办法是让GraphicTool通过拷贝或者“克隆”一个Graphic子类的实例来创建新的Graphic,我们称这个实例为一个原型。比如你想构建一个拥有通用架构的音乐编辑器 ,该编辑器架构可以图形编辑,也可以增加一些表示音符、休止符和五线谱的新对象。此外,为定义选择板中的那些工具,还提供一个。从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。

火柴盒 389

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

设计模式 Day1| ●创建型模式(1.单例模式、2.工厂方法模式、3.抽象工厂模式、4.建造者模式(也叫生成器模式)、5.原型模式)

创建型模式

Grace_67的博客 832

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【设计模式精讲】创建型模式之原型模式(深克隆、浅克隆)

定义: 原型模式(Prototype Design Pattern)用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。西游记中的孙悟空 拔毛变小猴,孙悟空这种根据自己的形状复制出多个身外化身的技巧,在面向对象软件设计领域被称为原型模式.孙悟空就是原型对象.原型模式主要解决的问题。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

设计模式-原型模式 Prototype Pattern

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

wesigj的博客 1699

Java设计模式-创建型设计模式-原型模式

Java设计模式-创建型设计模式-原型模式

Fatter$hday的博客 1576

设计模式--六种创建型模式

前言   每几种模式之间都有一定的联系,从中发现它们的相同点和不同点,研究发生改变的节点,这就是本篇博客所要说明的创建型设计模式之间的联系。它们包括:简单工厂模式、单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。 创建型模式的基本理解 创建型模式抽象了实例化过程。它们帮助一个系统独立于如何创建、组合和表示它的那些对象。 一个类创建型模式使用继承改变被实例

冯浩月 9638

【设计模式】创建型模式(五):原型模式

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式之一。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

Data · Model · Agent · Repeat 1197

【设计模式】(万字总结)深入理解Java中的创建型设计模式

本文将带领您深入探索Java中的创建型设计模式。我们将从简单的概念入手,逐步深入到每种模式的具体实现方式和实际应用场景。

c18213590220的博客 1369
上一篇: HTTP协议详解(1)
下一篇: (5)设计模式之建造者模式(创建型模式)
yi博说
博客等级 码龄11年 20粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值