Unity设计模式——原型模式

news2024/11/24 17:55:27

        原型模式(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.coloradmin.cn/o/1071361.html

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

相关文章

【python】可视化-绘制带有边权重的无向图

文章目录 需求示例数据代码实现 需求 输入数据表(矩阵),绘制无向图。 示例数据 **示例数据1:**3个特征之间的关系数据 (data1.txt) featuresfeature1feature2feature3feature110.60.8feature20.610.3feature30.80.31 **示例数据2:**4个特…

python matplotlib 显示中文

最近再弄新的服务器,结果上面画图的时候没有中文。 用下面这段代码看一下是不是支持呢? from matplotlib.font_manager import FontManager import subprocess fm FontManager() mat_fonts set(f.name for f in fm.ttflist)print (mat_fonts) output…

[UE虚幻引擎] DTCopyFile 插件说明 – 使用蓝图拷贝复制文件 (Windows)

本插件可以在虚幻引擎中使用蓝图对系统的其他文件进行拷贝复制操作。 1. 节点说明 Async Copy File ​ 异步复制文件 Param Source File : 要复制的源文件的完整路径。Param Target File : 要复制的目标文件的完整路径。Param Force Copy : 如果为true,则如果目标…

ASPICE标准快速掌握「4.3. 工作产品特性表(WPCs)」

注:标注*的通用工作产品并没有在 Automotive SPICE 过程评估模型中使用,但是为了完整性而包含它们。 01-00 【配置项】 通过配置控制所维护的项: 可包括组件、子系统、库、测试用例、编译器、数据、文档、物理媒介和外部接口版本标识得到维护以下关于项的描述应包含: 项的类…

华为云CodeArts Check代码检查插件(Cloud IDE版本)使用指南

CodeArts Check Cloud IDE代码检查插件 感兴趣的小伙伴,可以试试使用我们的CodeCheck代码检查插件:>>>CodeArts Check代码检查插件免费体验 CloudIDE插件市场里,当前CodeCheck代码检查插件是精选插件>>>CodeArts Check代码…

LED灯实验--汇编

asm-led.S .text .global _start _start: /* 1. led灯的初始化 *//* 1.1 使能GPIOE、DPIOF外设控制器的时钟 */ldr r0, 0x50000A28ldr r1, [r0]orr r1, r1, #(0x3 << 4)str r1, [r0]/* 1.2 设置PE10、PE8、PF10引脚为输出模式 */ldr r0, 0x50006000ldr r1, [r0]bic r1,…

Swagger使用详解

目录 一、简介 二、SwaggerTest项目搭建 1. pom.xml 2. entity类 3. controller层 三、基本使用 1. 导入相关依赖 2. 编写配置文件 2.1 配置基本信息 2.2 配置接口信息 2.3 配置分组信息 2.3.1 分组名修改 2.3.2 设置多个分组 四、常用注解使用 1. ApiModel 2.A…

除静电离子风蛇的工作原理及应用

静电离子风蛇是一种通过产生大量负离子来中和空气中的静电荷的设备。它们通常用于防止静电对电子设备、印刷机、加工机等工业设备造成损害。 静电离子风蛇的工作原理是通过电离器将空气中的氧气分子转化为氧离子&#xff0c;然后将这些氧离子释放到空气中。这些氧离子会与空气…

竞赛选题 机器学习股票大数据量化分析与预测系统 - python 竞赛选题

文章目录 0 前言1 课题背景2 实现效果UI界面设计web预测界面RSRS选股界面 3 软件架构4 工具介绍Flask框架MySQL数据库LSTM 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 机器学习股票大数据量化分析与预测系统 该项目较为新颖&am…

WIN10 NPM的安装

引言&#xff1a; 什么是node.js? javaScript是一门脚本语言&#xff0c;通常被用来编写、执行本地源代码。脚本语言需要一个解析器才能运行&#xff0c;HTML文件中的JavaScript代码由浏览器解析执行。而自行执行JavaScript代码则需要Node.js解析器才能运行。 每个解析器都…

Zabbix监控系统与部署添加 zabbix 客户端主机

目录 1 添加 zabbix 客户端主机 1.1 服务端和客户端都配置时间同步 1.2 设置 zabbix 的下载源&#xff0c;安装 zabbix-agent2 1.3 修改 agent2 配置文件 1.4 在服务端验证 zabbix-agent2 的连通性 1.5 在 Web 页面中添加 agent 主机 1 添加 zabbix 客户端主机 systemctl…

SpringCloud之Stream框架集成RocketMQ消息中间件

Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架。它可以基于 Spring Boot 来创建独立的、可用于生产的 Spring 应用程序。Spring Cloud Stream 为一些供应商的消息中间件产品提供了个性化的自动化配置实现&#xff0c;并引入了发布-订阅、消费组、分区这三…

Jenkins配置钉钉通知

Jenkins 作为最流行的开源持续集成平台&#xff0c;其强大的拓展功能一直备受测试人员及开发人员的青睐。大家都知道我们可以在 Jenkins 中安装 Email 插件支持构建之后通过邮件将结果及时通知到相关人员。 但其实 Jenkins 还可以支持钉钉消息通知&#xff0c;其主要通过 Ding…

Android原生实现控件阴影方案(API28及以上)

Android控件的阴影效果的实现方式有很多种&#xff0c;这里介绍一下另一种Android原生的阴影实现方案&#xff08;API28及以上&#xff09;。 我们利用elevation、outlineAmbientShowColor、outlineSpotShadowColor来实现一个带阴影的Button。 实现效果如下图&#xff0c;阴影宽…

第0章 前言

大家好&#xff0c;我叫 Rick Blyth&#xff0c;我是一名软件开发人员、企业家、创始人、博主和父亲 &#x1f44b; 几年前&#xff0c;在成功构建和扩展了一些自筹资金的 Micro SaaS&#xff08;微型 SaaS&#xff09; 应用后&#xff0c;我放弃了&#xff08;薪水不错但很糟…

SpringBoot 实现数据脱敏

SpringBoot 实现数据脱敏 前言Hutool 实现数据脱敏引入依赖脱敏工具类代码实现 使用注解的方式定义枚举自定义序列化类定义注解测试 前言 数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形&#xff0c;实现敏感隐私数据的可靠保护。 数据脱敏常用规则有替换、重排、加密…

接口测试和性能测试的区别

最近我在一个论坛上看到了一个关于性能测试和接口测试的经典问题&#xff0c;问题如下&#xff1a; 问题&#xff1a;后端性能测试&#xff0c;一个功能其实都是由后台多个接口组成的。 例如一个单据的保存&#xff0c;可能后台需要调用几个接口。用LR录制这个功能做性能测试。…

Java如何进行数据脱敏

1.SQL数据脱敏实现 MYSQL(电话号码,身份证)数据脱敏的实现 1 2 3 4 5 6 7 8 -- CONCAT()、LEFT()和RIGHT()字符串函数组合使用&#xff0c;请看下面具体实现 -- CONCAT(str1,str2,…)&#xff1a;返回结果为连接参数产生的字符串 -- LEFT(str,len)&#xff1a;返回从字符串st…

Vue Router的进阶

进阶 导航守卫 官方文档上面描述的会比较深奥&#xff0c;而守卫类型也比较多&#xff0c;其中包含了全局前置守卫、全局解析守卫、全局后置钩子、路由独享守卫、组件内守卫。每一种守卫的作用和用法都不相同。这会使得大家去学习的时候觉得比较困难&#xff0c;这边主要介绍…

如何平衡需求的优先级冲突?

每个项目都有各种需求&#xff0c;如业务需求、技术需求、用户需求、系统需求。我们需要对这些需求进行优先级排序&#xff0c;平衡不同利益相关者的需求&#xff0c;以更好满足客户需求&#xff0c;确保关键业务目标得到优先满足&#xff0c;并合理分配资源&#xff0c;避免资…