Unity设计模式——原型模式

        原型模式(Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节 。

原型类 Prototype:

abstract class Prototype
{private string id;public Prototype(string id){this.id = id;}public string Id{get { return id; }}//抽象类关键有这样一个Clone方法public abstract Prototype Clone();
}

 ConcretePrototypel类,具体原型

class ConcretePrototypel : Prototype
{public ConcretePrototypel(string id) : base(id) { }public override Prototype Clone(){//创建一个新对象,然后将当前对象非静态字段复制到该新对象//如果字段是值类型,则逐位复制字段,引用类型只复制引用地址return (Prototype)this.MemberwiseClone();}
}

客户端:

class Main : MonoBehaviour
{private void Start(){ConcretePrototypel pl = new ConcretePrototypel("I");ConcretePrototypel cl = (ConcretePrototypel)pl.Clone();Debug.Log("clone" + cl.Id);}
}

由于克隆实在太常用,.Net在System命名空间提供了IClone接口,唯一的Clone()方法,只要实现这个接口就可以完成原型模式了。

 简历类:

class Resume : ICloneable
{private string name;private string sex;private string age;private string timearea;private string company;public Resume(string name){this.name = name;}//设置个人信息public void SetPersonalInfo(string sex,string age){this.sex = sex;this.age = age;}//设置工作经历public void SetWorkExperrience(string timeArea,string company){this.timearea = timeArea;this.company = company;}//显示public void Display(){//实现接口方法,克隆对象Debug.Log(name + " " + sex + " " + age);Debug.Log(timearea + " " + company);}public object Clone(){return (object)this.MemberwiseClone();}
}

客户端:

class Main : MonoBehaviour
{private void Start(){Resume a = new Resume("DJ");a.SetPersonalInfo("男", "22");a.SetWorkExperrience("1995-2022", "DJDJ");//调用克隆方法就可以实现新简历,并且可以修改新简历细节Resume b = (Resume)a.Clone();b.SetPersonalInfo("nv", "20");Resume c = (Resume)a.Clone();c.SetWorkExperrience("1999-2222", "JJJJ");a.Display();b.Display(); c.Display();}
}

输出结果:

        现实设计当中,一般会再有一个“工作经历”类,当中有“时间区间”和“公司名称”等属性,“简历”类直接调用。

class Resume : ICloneable
{private string name;private string sex;private string age;private WorkExperience work;///引用“工作经历”对象public Resume(string name){this.name = name;work = new WorkExperience();//简历实例化同时实例化工作经历}public void SetPersonalInfo(string sex,string age){this.sex = sex;this.age = age;}public void SetWorkExperrience(string workDate,string company){work.WorkDate = workDate;//调用方法,给对象赋值work.Company = company;}public void Display(){Debug.Log(name + " " + sex + " " + age);Debug.Log(work.WorkDate + " " + work.Company);//显示工作经历属性值}public object Clone(){return (object)this.MemberwiseClone();}
}
class WorkExperience
{private string workDate;public string WorkDate{get { return workDate; }set { workDate = value; }}private string company;public string Company{get { return company; }set { company = value; }}
}

使用之前的客户端逻辑,运行后结果:

        对于引用类型,克隆后没有实现真正的克隆,而是只克隆了引用地址,这叫做“浅复制”,被复制对象的所有变量都含有与原来的对象相同的值;而所有的对其他对象的引用都仍然指向原来的对象。

深复制把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

深复制流程:

首先修改WorkExperience类,增加克隆方法

class WorkExperience
{private string workDate;public string WorkDate{get { return workDate; }set { workDate = value; }}private string company;public string Company{get { return company; }set { company = value; }}public object Clone(){//工作经历类也实现克隆方法return (object)MemberwiseClone();}
}

 然后修改简历类,新增构造函数,方便克隆工作经历类,再修改简历类的克隆方法

class Resume : ICloneable
{private string name;private string sex;private string age;private WorkExperience work;public Resume(string name){this.name = name;work = new WorkExperience();}//提供Clone方法调用的私有构造函数,以便克隆工作经历数据public Resume(WorkExperience work){this.work = (WorkExperience)work.Clone();}public void SetPersonalInfo(string sex,string age){this.sex = sex;this.age = age;}public void SetWorkExperrience(string workDate,string company){work.WorkDate = workDate;work.Company = company;}public void Display(){Debug.Log(name + " " + sex + " " + age);Debug.Log(work.WorkDate + " " + work.Company);}//调用私有构造方法,让工作经历克隆,然后再给新对象其他字段赋值//最终返回一个深复制的简历对象public object Clone(){Resume obj = new Resume(this.work);obj.name = this.name;obj.sex = this.sex; obj.age = this.age;return obj;}
}

还是使用之前的客户端逻辑,结果如下。 

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

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

相关文章

十一、2023.10.5.计算机网络(end).11

文章目录 17、说说 TCP 可靠性保证?18、简述 TCP 滑动窗口以及重传机制?19、说说滑动窗口过小怎么办?20、说说如果三次握手时候每次握手信息对方没收到会怎么样,分情况介绍?21、简述 TCP 的 TIME_WAIT,为什么需要有这个状态&…

虚拟机机初始化配置

虚拟机信息 镜像:Centos7 模板机配置:4U4G 100G存储 /boot 800MB /swap 物理内存如果低于2G,设定为虚拟内存设定为物理内存2倍,物理内存高于2G设定为4G。 / 95.2G 虚拟机安装完成后配置网卡 [rootlocalho…

ctfshow-web5(md5弱比较)

打开题目链接是html和php代码 html没啥有用信息,这里审一下php代码 : 要求使用get方式传入两个参数 v1,v2 ctype_alpha()函数:用于检查给定的字符串是否仅包含字母; is_numeric()函数:检测字符串是否只由…

聊聊分布式架构05——[NIO基础]BIO到NIO的演进

目录 I/O I/O模型 BIO示例 BIO与NIO比较 NIO的三大核心 NIO核心之缓冲区 Buffer常用子类: Buffer常用API Buffer中的重要概念 NIO核心之通道 FileChannel 类 FileChannel常用方法 NIO核心之选择器 概述 应用 NIO非阻塞原理分析 服务端流程 客户端…

请求的转发和重定向

RequestDispatcher接口实现转发: jsp1上链接到Servlet,Servlet再转发(关键在这里怎么实现转发??) 演示index.html页面---->Servlet1(转发到)------>Servlet2 实现转发流程 1.用HttpServletReques…

如何解决openal32.dll丢失,有什么办法解决

你第一次知道openal32.dll文件是在什么情况下,你了解过openal32.dll文件吗?如果电脑中openal32.dll丢失有什么办法可以解决,今天就教大家如何解决openal32.dll丢失,都有哪些办法可以解决openal32.dll丢失。 一.openal3…

Mac下docker安装MySQL8.0.34

学习并记录一下如何用docker部署MySQL 在Docker中搜索并下载MySQL8.0.x的最新版本 下载好后,在Images中就可以看到MySQL的镜像了 通过下面的命令也可以查看docker images启动镜像,使用下面的命令就可以启动镜像了docker run -itd --name mysql8.0.34 -…

2021年03月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python编程(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 对于字典infor {“name”:“tom”, “age”:13, “sex”:“male”},删除"age":13键值对的操作正确的…

蓝桥杯每日一题2023.10.9

题目描述 成绩统计 - 蓝桥云课 (lanqiao.cn) 题目分析 学会使用四舍五入函数round #include<bits/stdc.h> using namespace std; int s1, s2; int main() {int n, x;cin >> n;for(int i 1; i < n; i ){cin >> x; if(x > 60)s1 ;if(x > 85)s2 ;…

C语言练习百题之插入一个数

题目:有一个已经排好序的数组。现输入一个数&#xff0c;要求按原来的规律将它插入数组中。 程序分析 要将一个数插入已经排好序的数组中&#xff0c;我们可以采用以下步骤&#xff1a; 遍历数组&#xff0c;找到第一个大于待插入数的位置。将待插入数插入到该位置&#xff…

关于一篇ElementUI之CUD+表单验证

目录 一.CUD增删改查简述 1.1.增删改功能实现 二.表单验证 前端所有代码&#xff1a; 好啦今天就分享到这了&#xff0c;希望能帮到你哦&#xff01;&#xff01;&#xff01; 以下的代码基于我博客中的代码进行续写 : 关于ElementUI之动态树数据表格分页实例 一.CUD增删改…

北斗导航 | 位置差分、伪距差分以及载波相位平滑伪距(差分定位方法二)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 位置差分、伪距差分以及载波相位平滑伪距 位置差分伪距差分载波相位平滑…

【算法练习Day14】二叉树的最大深度二叉树的最小深度完全二叉树的节点个数

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 二叉树的最大深度二叉树的最…

【Qt控件之QDialog】使用及技巧

简介 QDialog是Qt中的一个类&#xff0c;继承自QWidget类&#xff0c;用于创建对话框窗口&#xff0c;可以显示模态&#xff08;阻塞当前窗口&#xff09;或非模态的对话框。对话框可以包含各种控件&#xff0c;如按钮、文本框等&#xff0c;用于与用户进行交互。 主要函数说…

19哈希表——数组中的妙用

目录 LeetCode之路——202. 快乐数 分析&#xff1a; LeetCode之路——1. 两数之和 分析&#xff1a; 解法一&#xff1a;暴力枚举 解法二&#xff1a;哈希表 LeetCode之路——202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对…

CocosCreator 面试题(三)JavaScript闭包原理和作用

1、JavaScript闭包是什么&#xff1f; JavaScript闭包是指在函数内部创建的函数&#xff0c;它可以访问并持有创建它的父函数作用域中的变量&#xff0c;即使父函数已经执行完毕。闭包是JavaScript中强大而有用的概念&#xff0c;它可以用于创建私有变量、实现模块化和封装性&a…

312.戳气球

将戳气球转换到添加气球&#xff0c;记忆搜索slove(i,j)&#xff1a;在开区间(i,j)全部填满气球得到的最多硬币数&#xff0c;两端val[i]、val[j] class Solution { public:vector<vector<int>> ans;vector<int> val;int slove(int left,int right){if(left&…

COCI 2021-2022 #1 - Set 题解

思路 我们将原题中的数的每一位减一&#xff0c;此时问题等价。 下面的异或都是在三进制下的异或。&#xff08;相当于不进位的加法&#xff09; 我们考虑原题中的条件&#xff0c;对于每一位&#xff0c;如果相同&#xff0c;则异或值为 0 0 0&#xff0c;如果为 1 1 1&a…

【Java项目推荐之黑马头条】自媒体文章实现异步上下架(使用Kafka中间件实现)

自媒体文章上下架功能完成 需求分析 流程说明 接口定义 说明接口路径/api/v1/news/down_or_up请求方式POST参数DTO响应结果ResponseResult DTO Data public class WmNewsDto {private Integer id;/*** 是否上架 0 下架 1 上架*/private Short enable;}ResponseResult 自媒…

设计模式 - 行为型模式:策略模式(概述 | 案例实现 | 优缺点 | 使用场景)

目录 一、行为型模式 1.1、策略模式 1.1.1、概论 1.1.2、案例实现 1.1.3、优缺点 1.1.4、使用场景 一、行为型模式 1.1、策略模式 1.1.1、概论 策略模式设计的每一个算法都封装了起来&#xff0c;使他们可以相互替换&#xff0c;通过一个对象委派不同的算法给相应的客户…