11.什么档次的原型模式和我写的一样

在这里插入图片描述
在《生化危机》系列电影中,克隆人是个频频出现的话题。保护伞公司为了需求复制出另一个战力相当的战士Alice,不惜克隆成百上千个Alice,然而直到最后,非但没有真正克隆出另一个完美的Alice,就连Alice自己也被证实是保护伞董事的一个克隆人。

克隆人一直是饱含伦理争议的话题,但是在软件设计领域,克隆思想却很受欢迎。软件旨在用程序替代人工去做重复性的工作。归根结底,“懒”是推动软件发展的重要助力,原型模式就是克隆思想的重要应用之一。


一言

原型实例指定创建对象的种类,通过拷贝这些原型创建新的对象。


概述

原型模式是一种创建型设计模式,它允许一个对象再创建一个可定制的对象而无需知道如何创建的细节。就像爱丽丝直到最后才指导自己也是克隆人一样,实例本身是不关注
创建实例的细节的。


原理

通过将一个原型对象传给要发动创建的对象,要发动创建的对象通过请求原型对象拷贝它们自己来实施创建,即bean.clone()。
在这里插入图片描述


欢迎来到保护伞公司

在这里插入图片描述

职员7568你好,欢迎你加入保护伞公司,徐江博士交给你的第一个任务是,编写代码,复制十个爱丽丝,加油!

循规蹈矩的豪赌

小职员7568稍加思索便写出了如下代码:

反例代码

Alice原型

public class Alice{private String name;private int age;private String skill;public Sheep(String name, int age, String skill) {this.name = name;this.age = age;this.skill= skill;}//setter & getter@Overridepublic String toString() {return "Alice{" +"name='" + name + '\'' +", age=" + age +", skill='" + skill+ '\'' +'}';}

驱动机

public class Client {public static void main(String[] args) {Alice alice= new Alice ("alice", 18, "极强的战斗天赋");Alice alice1= new Alice ("alice", 18, "极强的战斗天赋");Alice alice2= new Alice ("alice", 18, "极强的战斗天赋");Alice alice3= new Alice ("alice", 18, "极强的战斗天赋");Alice alice4= new Alice ("alice", 18, "极强的战斗天赋");System.out.println(alice);System.out.println(alice1);System.out.println(alice2);System.out.println(alice3);System.out.println(alice4);}
}

不一会,职员7568就高呼自己完成了任务。
徐江博士看了看代码,吩咐手下,“拖出去喂丧尸,什么档次跟我在一个公司工作?”

在这里插入图片描述
所以,保护伞公司职员-1。

问题分析

那么究竟是什么问题导致博士那么生气呢?
首先,要肯定上述代码的优势,简单易操作。但是,在创建新对象的时候总是需要重新获取原始对象的属性,如果创建的对象比较复杂时,效率会及低。而且每一次都需要重新初始化对象,灵活性太低。

浅拷贝

“老,老板,我有一个不太成熟的思路,不知道当讲不当讲”,职员7569瑟瑟发抖。
“ 讲!”
“Java中Object类是所有类的根类,Object类提供了一个clone()方法,该方法可以将一个Java对象复制一份,但是需要实现clone的Java类必须要实现一个接口cloneable该接口表示该类能够复制且具有复制的能力。通过这种方式,或许…”
徐博士听着这段构想,嘴角露出了不易察觉的微笑:
“很好,但是我有一个要求,我要让这些爱丽丝们做朋友”

代码实现

public class Alice implements Cloneable{private String name;private int age;private String skill;public Alice friend;public Alice (String name, int age, String skill) {this.name = name;this.age = age;this.skill= skill;}@Overrideprotected Object clone(){Alice alice = null;try {alice = (Alice ) super.clone();}catch (Exception e){System.err.println(e.getMessage());}return alice ;}@Overridepublic String toString() {return "Alice{" +"name='" + name + '\'' +", age=" + age +", skill='" + skill+ '\'' +'}';}
}

徐博士的检查

徐博士看了看代码,继续吩咐手下,“拖出去,喂丧尸,什么档次跟我待一个公司。”
职员7569高呼:“我不服,我的代码有什么问题?”
徐博士看了看他涨红的面庞,缓缓的将Alice实例的friend属性的哈希值打印了出来,小职员呆住了,再没有了一丝力气。

在这里插入图片描述
保护伞公司职员-1

在实体属性发生变更时,原型模式可以以很小的改动代价实现对象的拷贝。但是,上述实现的克隆并不会将本体的对象属性做到真正意义的克隆,只是将对象的引用复制了多份,所以我们称之为浅克隆。

深拷贝

职员7570汗流浃背了,因为下一个就轮到他来解决这个问题,他拼命的思考,终于,他起身了。
“博士,我想到了。我们复制对象的所有基本数据类型的成员变量值,为所有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可达的所有对象。也就是说,对象进行深拷贝要对整个对象进行拷贝。”
徐博士抬头看了看这个少年:“继续”
小职员咽了咽口水:“对于深拷贝的实现方式,我想可以通过重写clone方法…或者 ,或者通过对象实例化实现深拷贝。”
徐博士又深深的看了一言面前这个侃侃而谈的少年:“看来你不是个草包,写写看看吧。”
在这里插入图片描述

代码实现

public class DeepCloneAbleTarget implements Serializable,Cloneable{private static final long serivalVersionID = 1L;private String cloneName;private String cloneClass;public DeepCloneAbleTarget(String cloneName, String cloneClass) {this.cloneName = cloneName;this.cloneClass = cloneClass;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
public class DeepProtoType implements Serializable,Cloneable {public String name;public DeepCloneAbleTarget deepCloneAbleTarget;@Overrideprotected Object clone() throws CloneNotSupportedException {Object deep = null;deep =super.clone();DeepProtoType deepProtoType  =(DeepProtoType) deep;deepProtoType.deepCloneAbleTarget = (DeepCloneAbleTarget) deepCloneAbleTarget.clone();return deepProtoType;}public Object deepClone(){ByteArrayOutputStream bos = null;ObjectOutputStream oos = null;ByteArrayInputStream bis = null;ObjectInputStream ois = null;try {bos = new ByteArrayOutputStream();oos = new ObjectOutputStream(bos);oos.writeObject(this);bis = new ByteArrayInputStream(bos.toByteArray());ois = new ObjectInputStream(bis);DeepProtoType copyObj = (DeepProtoType) ois.readObject();return copyObj;}catch (Exception e){System.err.println(e.getMessage());return null;}finally {try {bos.close();oos.close();bis.close();ois.close();} catch (IOException e) {e.printStackTrace();}}}
}

创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程,同时也能够提高效率。不用重新初始化对象,而是动态地获得对象运行时的状态。如果原始对象发生变化(增加或者减少属性),其它克隆对象的也会发生相应的变化无需修改代码。

但是在实现深克隆的时候可能需要比较复杂的代码。同时,需要为每一个类配备一个克隆方法,这对全新的类来说不是很难,但对已有的类进行改造时,需要修改其源代码,违背了ocp原则。

好啦,今天在保护伞公司的打工之旅就到此为止,祝各位好运。


关注我,共同进步,每周至少一更。——Wayne

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/635227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot(三层框架Controller,Mapper,Service)中遇到的一些注解整理

本文主要从Controller层,Service层,Mapper层这三层架构中记录用到的各种注解 还有一些MyBatis用到的注解 持续更新到本人的毕设做完为止,太多了太多了根本学不完哈哈哈 1.Controller层 1.1GetMapping/PostMapping/DeleteMapping/PutMapping 用于建立HTTP请求与处理方法之间的…

Go 爬虫之 colly 从入门到不放弃指南

文章目录 概要介绍如何学习官方文档如何安装快速开始如何配置调试分布式代理层面执行层面存储层面存储多收集器配置优化持久化存储启用异步加快任务执行禁止或限制 KeepAlive 连接扩展总结如果想用 GO 实现爬虫能力,该如何做呢?抽时间研究了 Go 的一款爬虫框架 colly。 概要…

Qt文件和目录相关操作

1.相关说明 QCoreApplication类、QFile类、QDir、QTemporaryDir类、QTemporaryFile类、QFileSystemWatcher类的相关函数 2.相关界面 3.相关代码 #include "dialog.h" #include "ui_dialog.h" #include <QFileDialog> #include <QTemporaryDir>…

Ardupilot开源飞控之VTOL之旅:打印件清单

Ardupilot开源飞控之VTOL之旅&#xff1a;打印件清单 1. 源由2. 清单2.1 模拟VTX打印件2.2 摄像头打印件2.3 GPS & RC天线打印件2.4 飞控 & 电调打印件 3. 总结4. 参考资料 1. 源由 VTOL一直仍在角落吃灰&#xff0c;主要还是手头缺点经费&#xff0c;搞台3D打印机基本…

Kotlin 移动端多平台

支持多平台编程是 Kotlin 的主要优势之一。它减少了为不同平台编写和维护相同代码所花费的时间&#xff0c;同时保留了本机编程的灵活性和优势。 1. 基本概念 KMM&#xff1a;Kotlin Multiplatform for mobile&#xff08;移动设备的 Kotlin 多平台&#xff09; KMM 多平台的主…

16k+ start 一个开源的的监控系统部署教程

安装条件 Linux或macOS系统 4GB内存 开放 33014、33174、3183端口 1.安装 1、下载源码 首先使用 git 克隆源码到本地 git clone -b main https://github.com/SigNoz/signoz.git && cd signoz/deploy/ 方式1&#xff1a;运行 install.sh 脚本一键安装 ./install.s…

luffy商城项目(一)

企业项目类型 # 1 面向互联网用户&#xff1a;商城类项目 -微信小程序商城 # 2 面向互联网用户&#xff1a;二手交易类的 -咸鱼 -转转 # 3 公司内部项目&#xff1a;python写的重点 -oa系统 -打卡系统工资核算系统 -第三方公司做的&#xff1a…

leetCode-42.接雨水

&#x1f4d1;前言 本文主要是【算法】——算法模拟的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&#xff…

git提权

实验环境——vulnhub-dc2靶场 git提权 前提&#xff1a;用户可以使用sudo中git权限 查看sudo权限 sudo -l可以发现git命令存在sudo提权 基于此进行权限提升 方式&#xff1a; sudo git help config #在末行命令模式输入 !/bin/bash 或 !sh #完成提权 sudo git -p help…

直接发文!1D-2D-MTF-CNN-GRU-AT多通道图像时序融合的分类/故障识别程序!Excel导入,直接运行

​适用平台&#xff1a;Matlab2023版本及以上 本程序同时结合两篇国内顶级EI的方法&#xff1a;提出1D-2D-MTF-CNN-GRU-AT多通道图像时序融合的分类/故障识别程序&#xff01; ①中文EI期刊《电力自动化设备》12月29号网络首发文献&#xff1a;《基于格拉姆角场与并行CNN的并…

【PyTorch】PyTorch之Reduction Ops

文章目录 前言一、ARGMAX二、ARGMIN三、AMAX和AMIN四、ALL和ANY五、MAX和MIN六、MEAN七、MEDIAN八、NORM九、PROD十、STD十一、SUM十二、UNIQUE十三、VAR 前言 介绍pytorch的Reduction Ops。 一、ARGMAX torch.argmax(input, dim, keepdimFalse) → LongTensor Parameters&a…

突破Android开发瓶颈:6年Android开发者的实用建议

作为一名在Android领域摸爬滚打6年的老手&#xff0c;我想给那些在这个行业工作了3~5年的朋友们提供一些职业和技术上的建议。 许多开发者在职业生涯中都会遇到一个瓶颈期&#xff0c;尤其是当你在一个公司待了很长时间&#xff0c;感觉自己的技术和业务能力都无法得到提升时。…

多输入多输出 | Matlab实现基于LightGBM多输入多输出预测

多输入多输出 | Matlab实现基于LightGBM多输入多输出预测 目录 多输入多输出 | Matlab实现基于LightGBM多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于LightGBM多输入多输出预测&#xff08;完整源码和数据&#xff09; 1.data为数据集&a…

近期学习文章

DNSlog在渗透测试中的实战技巧 - 网安隐藏源IP&#xff0c;提高溯源难度的几种方案 - 网安FreeBuf网络安全行业门户 【漏洞公告】某平台一个有意思的CSRF // SecTrain安全博客 浅谈Web源码泄漏-安全客 - 安全资讯平台 红队-C2 Server基础构建 - 先知社区FreeBuf网络安全行业…

【电力电子在电力系统中的应用】2 CCM和DCM模式下Cuk电路的升降压工作状态

【仅供参考】 【2023.03西南交大电力电子在电力系统中的应用】 目录 0 仿真要求 1 仿真电路搭建及波形记录 1.1 CCM工作模式 1.1.1 升压模式 1.1.2 降压模式 1.2 DCM工作模式 1.2.1 升压模式 1.2.2 降压模式 1.3 改变开关频率和电容参数 1.3.1 改变开关频率 1.3.2 …

高清网络视频监控系统技术方案

目 录 一、概述 二、建设目标及需求 &#xff08;一&#xff09;建设总目标 &#xff08;二&#xff09;需求分析 三、设计依据与设计原则 &#xff08;一&#xff09;设计依据 &#xff08;二&#xff09;设计原则 四、建设方案设计 &#xff08;一&…

实用干货:最全的Loading动画合集网站!复制即用

大家好&#xff0c;我是大澈&#xff01; 本文约1000字&#xff0c;整篇阅读大约需要2分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费领取"面试礼包"一份&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff01…

01-开始Rust之旅

1. 下载Rust 官方推荐使用 rustup 下载 Rust&#xff0c;这是一个管理 Rust 版本和相关工具的命令行工具。下载时需要连接互联网。 这边提供了离线安装版本。本人学习的机器环境为&#xff1a; ubuntu x86_64&#xff0c;因此选用第②个工具链&#xff1b; 1. rust-1.75.0-x86_…

分布式ID(2):雪花算法生成ID

1 雪花算法简介 这种方案大致来说是一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案把64-bit分别划分成多段,分开来标示机器、时间等,比如在snowflake中的64-bit分别表示如下图(图片来自网络)所示: 41-bit的时间可以表示(1L&l…

【前端设计】流光按钮

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 css body{height: 100vh;display: flex;justify-content: center;align-items: center;background…