首页 > 其他分享 >从零玩转设计模式之原型模式-yuanxingmoshi

从零玩转设计模式之原型模式-yuanxingmoshi

时间:2023-05-19 12:13:27浏览次数:38  
标签:yuanxingmoshi 对象 clone 模式 原型 玩转 拷贝 设计模式

title: 从零玩转设计模式之原型模式
date: 2022-12-11 20:05:35.488
updated: 2022-12-23 15:35:44.159
url: https://www.yby6.com/archives/yuanxingmoshi
categories: 
- 设计模式
tags: 
- 设计模式
- 原型模式

什么是原型模式设计模式?

原型模式是一种软件设计模式,它允许您通过复制现有对象来创建新对象,而无需根据类来实例化对象。这种模式有助于减少创建对象的时间和资源,因为可以直接从已有的对象复制。原型模式通常与抽象工厂模式和工厂方法模式一起使用,以便为新创建的对象提供更复杂的功能。

定义

用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。
这种模式存在的应用场景在于,能够复制当前对象,实现对象数据的克隆。

需求

写出一个批量发送邮件

image-1670760284793

工具类

image-1670760287137

测试

image-1670760358294

直接这样发送没有办法保存原始模板 , 最后得到的是最后一条数据

image-1670760619062

需要的是打印出来的还是原先第一条数据

采用原型模式

在Mail类中实现cloneable接口,覆盖clone方法

继承Cloneable
image-1670760693916

重载clone方法

image-1670760698344

其它不需要改变

image-1670760821998

image-1670760824934

稍微封装一下

定义抽象原型

image-1670760888258

继承原型

image-1670760891759

使用

image-1670760895336

Prototype类需要具备以下两个条件

实现Cloneable接口。

  1. 在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。
  2. 在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。

重写Object类中的clone方法。

  1. Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。

UML图

image-1670761091032

深拷贝与浅拷贝

浅拷贝

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。

深拷贝

创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。

String要不要深拷贝

String类型是存在常量池当中的,不需要

原型实现深拷贝

public class Mail2 implements Cloneable{
    int age;
    String name;
    Date birthday;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Mail2 p =  (Mail2) super.clone();
        p.birthday = (Date) p.birthday.clone();
        return p;
    }

    @Override
    public String toString() {
        return "Mail2{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", birthday=" + birthday +
                '}';
    }
}

原型模式在源码中的应用

ArrayList

源码335行

image-1670770489390

HashMap

源码1326行

image-1670770559493

Mybatis CacheKey

源码108行

image-1670770615636

标签:yuanxingmoshi,对象,clone,模式,原型,玩转,拷贝,设计模式
From: https://www.cnblogs.com/Yangbuyi/p/17414760.html

相关文章

  • 从零玩转设计模式之外观模式-waiguanmos
    title:从零玩转设计模式之外观模式date:2022-12-1215:49:05.322updated:2022-12-2315:34:40.394url:https://www.yby6.com/archives/waiguanmoscategories:-设计模式tags:-设计模式什么是外观模式外观模式是一种软件设计模式,它提供了一种将多个子系统包装在一......
  • 从零玩转设计模式-从零玩转设计模式
    title:从零玩转设计模式date:2022-12-0400:14:53.517updated:2022-12-0400:41:09.896url:https://www.yby6.com/archives/从零玩转设计模式categories:tags:一、设计模式概述二、UML三、创建型模式5种四、结构型模式7种五、行为型模式11种六、如何正确使用......
  • 从零玩转前后端加解密之SM2-sm2
    title:从零玩转前后端加解密之SM2date:2022-08-2119:42:00.907updated:2023-03-3013:28:48.866url:https://www.yby6.com/archives/sm2categories:-加密算法-从零玩转系列tags:-加密算法-sm2前言SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密......
  • 从零玩转人脸识别验证-face
    title:从零玩转人脸识别验证date:2022-05-1521:05:52.974updated:2023-05-1600:00:11.594url:https://www.yby6.com/archives/facecategories:-Java分类-从零玩转系列-人脸识别tags:-java-人脸识别前言在线demo(前往享受人脸识别)本期教程人脸识别第......
  • 从零玩转Activiti7工作流-2021-09-12-16-22-07
    title:从零玩转Activiti7工作流date:2021-09-1216:22:08.51updated:2021-12-2617:43:12.171url:https://www.yby6.com/archives/2021-09-12-16-22-07categories:-工作流tags:Activiti讲师:波波​工作流(Workflow),就是通过计算机对业务流程自动化执行......
  • 从零玩转第三方登录之WeChat公众号扫码关注登陆 -wechatgzh
    title:从零玩转第三方登录之WeChat公众号扫码关注登陆date:2022-09-2722:46:53.362updated:2023-03-3013:28:41.359url:https://www.yby6.com/archives/wechatgzhcategories:-从零玩转系列tags:-第三方登录-从零玩转系列前言由于看见了面试鸭的登陆方式,我......
  • 从零玩转第三方登录之WeChat公众号登陆-cong-ling-wan-zhuan-di-san-fang-deng-lu-zhi
    title:从零玩转第三方登录之WeChat公众号登陆date:2022-09-0316:32:57.876updated:2022-09-0316:32:57.876url:https://www.yby6.com/archives/cong-ling-wan-zhuan-di-san-fang-deng-lu-zhi-wechat-gong-zhong-hao-deng-lucategories:tags:前言由于看见了面试鸭......
  • 从零玩转Yaip使用-cong-ling-wan-zhuan-yaip-shi-yong
    title:从零玩转Yaip使用date:2021-07-1615:47:17.624updated:2021-12-2617:43:12.255url:https://www.yby6.com/archives/cong-ling-wan-zhuan-yaip-shi-yongcategories:-apitags:Yaip****使用开发笔记1.什么是yapiYApi是高效、易用、功能强大的api管理平......
  • 从零玩转Websocket实时通讯服务之前后端分离版本-websocket
    title:从零玩转Websocket实时通讯服务之前后端分离版本date:2021-10-2500:47:12.945updated:2021-12-2617:43:10.496url:https://www.yby6.com/archives/websocketcategories:-OSS-mysql-api-单例模式-websokcettags:前言公司项目需要用到消息提示,那么......
  • 从零玩转SpringSecurity+JWT整合前后端分离-从零玩转springsecurityjwt整合前后端分离
    title:从零玩转SpringSecurity+JWT整合前后端分离date:2021-05-0614:56:57.699updated:2021-12-2617:43:19.478url:https://www.yby6.com/archives/从零玩转springsecurityjwt整合前后端分离categories:-Java分类tags:-SpringSecurity-Jwt2021年4月9日·预......