原型模式

克隆以后我就成了你——探究原型模式 孙悟空拔一根毫毛就可以变出好多一模一样的孙悟空!!!中国的克隆技术其实是世界领先的! 即便Jungle读书少,Jungle也清晰地记得中学生物课本上提到过的克隆羊“多利”。虽然多利寿命不长,但它的出现对“克隆(Clone)”技术意义重大。克隆,直观说就是从原有生物体上取体细胞,然后无性繁殖出有完全相同基因的个体或种群。这么说来中国的克隆技术其实是世界领先的,因为孙悟空拔一根毫毛变出许多一模一... 阅读详情

原型模式

 

什么是原型模式

克隆

原型模式是一个创建型的模式。原型二字表明了改模式应该有一个样板实例,用户从这个样板对象中复制一个内部属性一致的对象,这个过程也就是我们称的“克隆”。被复制的实例就是我们所称的“原型”,这个原型是可定制的。原型模式多用于创建复杂的或者构造耗时的实例,因为这种情况下,复制一个已经存在的实例可使程序运行更高效。

原型模式应用场景

 

(1)   类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等,通过原型拷贝避免这些消耗。 
(2)通过new产生的一个对象需要非常繁琐的数据准备或者权限,这时可以使用原型模式。 
(3)一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝。

Spring框架中的多例就是使用原型。

原型模式UML类图(通用)

原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件: 
  (1)实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。 
  (2)重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此Prototype类需要将clone方法的作用域修改为public类型。

 

Spring可以设置单例 多例(原型)本质上使用克隆技术

VO DTO 深浅 拷贝

克隆的对象先创建成功后 才可以创建  

 

废话不多说,上手敲:

要实现克隆的这个类 必须实现接口!然后重写方法!

package YuanXingModel;


import java.util.ArrayList;
import java.util.List;
//定义一个被克隆的类 这个类必须实现 Cloneable接口
public class Book implements Cloneable{

    private String title;  //书题目
    private ArrayList<String> imgs = new ArrayList<>();  //书里面的图片
    private int num;

    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public List<String> getImgs() {
        return imgs;
    }
    public void setImgs(ArrayList<String> imgs) {
        this.imgs = imgs;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    
    //封装一个方法
    public void addImg(String imgName) {
        imgs.add(imgName);
        
    }
    
    public void showBook(){   //展示下
        System.out.println("title是"+title);
        System.out.println("num是"+num);
        for(String img : imgs){
            System.out.println("img是"+img);
        }    
    }
    
    @Override
    protected Object clone() throws CloneNotSupportedException {
       //默认浅克隆   基本类型克隆了 引用类型没有克隆
         Book book = (Book)super.clone();   //做一个强转  
//            book.imgs =(ArrayList<String>)this.imgs.clone(); //再克隆一个 复制给新的  属性克隆
        //this.title.clone()  String是没有的! 大家可以试试!Stirng没有克隆方法哟 final类型的  
        return book;
    }
    
}

客户端:

package YuanXingModel;

public class Client {

    public static void main(String[] args) {

            Book book1 = new Book();
            book1.setTitle("算法导论");
            book1.addImg("图1");
            book1.addImg("图2");
            book1.setNum(300);
            book1.showBook();
            System.out.println("#############################");
        // 克隆一个 以原型方式进行复制
        try {
            Book book2 = (Book) book1.clone();
            book2.setTitle("设计模式");
            book2.addImg("图片A");
            book2.addImg("图片B");
            book2.setNum(900);
            book2.showBook();
            System.out.println(book1==book2);
             System.out.println("#############################");
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
         System.out.println("#############################");
        book1.showBook();  //再看看以前的
        
    }
}

运行结果:

 

book2修改了 会影响到book1   浅拷贝:只会拷贝基本类型,不会拷贝引用类型    原理 跟 之后的 都是《算法导论》  再打印时候 不是 《设计模式》  

此时可以打印下 book1 和 book2 的地址是否相同  运行结果是false    两个对象的内存地址是不一样的

 

 而引用类型复制之后,还是共同引用的! 看上面的图就OK啦。 基本数据类型是不会这样的 

 String 被final 修饰了 不能被更改了  

 

 深克隆,开辟新的内存地址。需要这么修改:

 

package YuanXingModel;


import java.util.ArrayList;
import java.util.List;
//定义一个被克隆的类 这个类必须实现 Cloneable接口
public class Book implements Cloneable{

    private String title;  //书题目
    private ArrayList<String> imgs = new ArrayList<>();  //书里面的图片
    private int num;

    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public List<String> getImgs() {
        return imgs;
    }
    public void setImgs(ArrayList<String> imgs) {
        this.imgs = imgs;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    
    //封装一个方法
    public void addImg(String imgName) {
        imgs.add(imgName);
        
    }
    
    public void showBook(){   //展示下
        System.out.println("title是"+title);
        System.out.println("num是"+num);
        for(String img : imgs){
            System.out.println("img是"+img);
        }    
    }
    
    @Override
    protected Object clone() throws CloneNotSupportedException {
       //默认浅克隆   基本类型克隆了 引用类型没有克隆
         Book book = (Book)super.clone();   //做一个强转  
            book.imgs =(ArrayList<String>)this.imgs.clone(); //再克隆一个 复制给新的  属性克隆
        //this.title.clone()  String是没有的! 大家可以试试!Stirng没有克隆方法哟 final类型的  
        return book;
    }
    
}

运行结果:

 

 总结一点 String 不会产生引用关系 是直接复制过来的 跟 基本类型一样了 而其他的引用类型不变哦

 如果我的基本类型以及String类型直接克隆了 没有做任何修改 看看会好玩不

package YuanXingModel;

public class Client {

    public static void main(String[] args) {

            Book book1 = new Book();
            book1.setTitle("算法导论");
            book1.addImg("图1");
            book1.addImg("图2");
            book1.setNum(300);
            book1.showBook();
            System.out.println("#############################");
        // 克隆一个 以原型方式进行复制
        try {
            Book book2 = (Book) book1.clone();
            book2.setTitle("设计模式");
            book2.addImg("图片A");
            book2.addImg("图片B");
            book2.setNum(900);
            book2.showBook();
            System.out.println(book1==book2);
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        book1.showBook();  //再看看以前的
        
    }
}

运行结果

大家自己玩玩看看!挺好玩的 我自己在写博客时候 感觉自己做了个排列组合~~

 

 

原型模式分为浅复制和深复制

浅复制 —-只是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用,我们把这种拷贝叫做“(浅复制)浅拷贝”,换句话说,浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。

深复制 —-在计算机中开辟了一块新的内存地址用于存放复制的对象。

Java 原型模式 文章目录原型模式原型模式Demo使用原型模式的好处浅克隆和深克隆浅克隆深克隆 原型模式 原型模式属于创建型模式,用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象!(但是学姐是不可复制的哦,只有我这里有,还不赶快关注我的 Java精选频道 ) 原型模式Demo 下了几次棋,学弟把学姐征服了多少次?这里是以次为单位,我们需要把这个枢纽创建出来,为下棋计单位! /** * 枢纽:... 阅读详情

相关推荐

【go-libp2p学习笔记】使用go-libp2p搭建中转服务器(circuit relay server)

libp2p算是一个蛮新的库,提供了非常强大的p2p节点发现/连接/通信能力。IPFS的基石。 中文网上的**技术教程**比较少,所以抛砖引玉开一点坑来体验一下!

Cake_C的博客 6491

原型模式---多例

原型模式 碎碎念:由于从来没有了解过原型,导致我说原型的时候总是会说多例,用多例来形容原型其实并无大问题,但应该知道原型与多例其实是同一个东西(prototype),我在面试阿里的时候就出过这样的窘境,面试官在说原型原型,我在说多例多例,我总以为面试官跟我说的其实是不同的东西,害,其实原型就是多例,多例就是原型。 在原型模式之前,我们先来看看传统的模式是如何创建一样的对象,例如我要创建10个一样的student对象 Student xiaoming = new Student(10,'小明'); Stud

weixin_44293582的博客 503

LuaJit分析(十一)去除string.dump函数

因此即使我们的指令顺序被打乱,通过loadfile系统调用,再通过string.dump调用,可以得到字节码文件,再通过与标准的luajit生成的字节码文件比对,即可找出差异所在。Lua脚本中的string.dump函数用于生成字节码文件,根据对 luajit -b命令的分析可以得出,最终dump出字节码文件都是使用的string.dump函数。同时lj_libdef.h和lj_ffdef.h这两个文件都是自动生成的,在msvcbuild.bat中,使用如下命令生成。

a545958498的博客 1132

Spring单例模式(singleton)和多例模式(prototype)

[color=red]Spring配置中默认的是单例模式[/color] singleton 单例模式 单例模式,在spring 中其实是scope(作用范围)参数的缺省设定值, 每个bean定义只生成一个对象实例,每次getBean请求获得的都是此实例。 单例模式分为饿汉模式和懒汉模式 饿汉模式 spring singleton的缺省是饿汉模式:启动容器时(即实例化容器时...

写博客只为学习 254

谷歌账号国家或地区设置修改全攻略:条件、流程与避坑指南

谷歌账号的国家或地区设置与付款资料、账号历史行为及登录环境强绑定,修改时需满足特定条件。其原理在于地区作为索引键,关联内容库、货币结算和风控策略。正确切换可解决内容推荐错乱、付款失败等问题,适用于搬家、订阅区域限定服务等场景。操作前需在目标地区创建付款资料、清空余额并取消订阅,且一年仅能修改一次。本文详解从准备到验证的完整流程,并揭示官方文档未提及的实操陷阱,助你安全完成地区切换。

weixin_42521558的博客 2324

【Ragflow】9.问答为什么比搜索响应慢?从源码角度深入分析

前几天看到有群友提到一个现象:Ragflow的搜索界面的问答速度很快,但聊天界面的问答速度很慢,究竟是什么原因?在深入挖掘源码之后,逐渐发现了问题的答案。

兴趣使然的创作者 2902

JAVA设计模式——【原型模式】

原型模式 克隆羊问题 现在有一只羊 tom,姓名为: tom,年龄为:1,颜色为:白色,请编写程序创建和 tom羊属性完全相同的10只羊。 传统方式解决克隆羊问题 思路分析(图解) 代码演示: public class Sheep { private String name; private int age; private String color; public Sheep(String name, int age, String color) { super(); .

龍弟-idea的博客 7956

(王道408考研数据结构)第一章绪论-第二节1:算法的基本概念、算法的特性及设计要求

算法(Algorithm):是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作王道视频课中讲到了一个例子,展示了算法就是解决问题的特定步骤的描述对于给定的问题可以有多种多样的算法来解决,只不过这些算法有各自的优点和缺点。

快乐江湖的博客 2684

详解原型模式

原型模式是一种创建型设计模式,其核心思想是通过复制现有的对象来创建新的对象,而不是通过传统的构造函数来创建对象。这种模式允许用户指定创建对象的种类,并通过拷贝这些原型来创建新的对象。 原型模式的主要优点包括: 提高性能:通过复制现有对象,可以避免重复创建对象的开销,特别是在需要频繁创建相似对象的场景中,原型模式能够显著提高性能。 简化对象创建过程:不需要知道具体的类信息,只需复制一个已经存在的实例即可创建新对象,从而简化了对象的创建过程。 原型模式适用于以下场景: 创建成本高或复杂的对象:当对象的创建

如无必要,勿增实体。 1537

QuecOpen RTOS学习笔记

对计算机响应时间有要求的系统,通常称为临界系统或应用。为了满足临界系统或应用对计算机响应 时间的要求,人们开发了实时操作系统(Real Time Operation System)。 实时操作系统指所有任务均在规定时间内完成的操作系统,同时任务完成必须满足时序可预测性。需 要注意的是,实时操作系统的本质是其反应具有时序可预测性。得益于此,实时操作系统通常反应非常快。 实时操作系统的内核对象一般包括任务、信号量、互斥锁、消息队列、定时器、事件通知和软件看门 狗等。

zxm8513优快云博客 2030

基于Matlab的磁力计校准(附源码)

磁力计沿传感器的 X、Y 和 Z 轴检测磁场强度。精确的磁场测量对于传感器融合以及确定航向和方向至关重要。为了用于航向和方向计算,需要校准典型的低成本MEMS磁力计,以补偿环境噪声和制造缺陷。一、理想磁力计理想的三轴磁力计沿正交 X、Y 和 Z 轴测量磁场强度。在没有任何磁干扰的情况下,磁力计读数测量地球磁场。如果在传感器通过所有可能的方向旋转时进行磁力计测量,则测量值应位于球体上。球体的半径是磁场强度。要生成磁场样本,请使用对象。出于这些目的,可以安全地假设每个方向的角速度和加速度为零。

珞瑜的博客 4520

【原型模式】原型模式深入分析

原型模式深入分析,浅拷贝,深拷贝

乘风破浪的程序猿 464

基于Cesium实现,动态水面+大坝排水动画

一、绘制面状水域,使用水波纹理,进行渲染,水体透明,可以看到底色。三、使用粒子系统,将喷泉改变方向,加上重力设置,实现排水动画。二、绘制线状三维体,用作模拟大坝拦截效果。四、最后,模拟水位上升,进行淹没分析,

一醉千秋的专栏 1420

设计模式之原型模式

采用 “原型模式” 重构邮件类 Mail,使每次发送新的邮件时,不用new 创建新的Mail 对象,2)复杂的依赖场景, 比如,F 对象的创建依赖 A,A 又依赖 B,B 又依赖 C……不采用设计模式,实现发送广告信,每次发送邮件时,需要new 创建一个新的Mail对象,同的工厂等级结构(具体工厂对应具体产品),而原型模式就不需要这样,原型模式的。产品复制是通过封装在原型类中的克隆方法实现的,无须专门的工厂类来创建产品。1)当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过复制一。

liang8999的博客 1579

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

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

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

对原型模式的理解

如User的ak字段。

南七行者的博客 741

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

原型模式介绍

文章目录1、定义与特点定义优点缺点2、结构与实现2.1、模式的结构2.2、模式的实现浅克隆模式深克隆模式3、应用场景参考 1、定义与特点 定义 ​ 原型(Prototype)模式,用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。例如,Windows 操作系统的安装通常较耗时,如果复制就快了很多。在生活中复制的例子非常多,这里不一一列举了。 优点 Java自带的原型模式基于内

FanGer的博客 1798

WINCC7.3破解文件

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

上一篇: 外观设计模式
下一篇: 策略模式
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值