c#设计模式-创建型模式 之 原型模式

news2024/9/27 17:28:58

概述

原型模式是一种创建型设计模式,它允许你复制已有对象,而无需使代码依赖它们所属的类。新的对象可以通过原型模式对已有对象进行复制来获得,而不是每次都重新创建。

原型模式包含如下角色:

  1. 抽象原型类:规定了具体原型对象必须实现的的 clone() 方法。
  2. 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
  3. 访问类:使用具体原型类中的 clone() 方法来复制新的对象。

案例

简介接口

public interface IResume
{
    //填写资料
    void SetPersonInfo(int age, string sex);
    //打印资料
    void Display();
    //克隆方法
    object Clone();
}

具体类

public class Resume : IResume
{
    private string name;
    private int age;
    private string sex;

    // 构造函数:初始化姓名
    public Resume(string name)
    {
        this.name = name;
    }

    // 填写个人信息
    public void SetPersonInfo(int age, string sex)
    {
        this.age = age;
        this.sex = sex;
    }

    //打印
    public void Display()
    {
        Console.WriteLine("姓名:" + name);
        Console.WriteLine("年龄:" + age + ",性别:" + sex);
    }

    // 克隆该实例
    public object Clone()
    {
        return MemberwiseClone() as Resume;
    }
}

测试

模拟创建了一份阿豪的简介,克隆给B对象,并对B对象的年龄进行更改

    public static void Main(string[] args)
    {
        //创建原型A对象
        Resume a = new Resume("阿豪");
        a.SetPersonInfo(18, "男");

        //克隆给B对象
        Resume b = a.Clone() as Resume;
        //修改B对象的内容
        b.SetPersonInfo(20, "男");

        Console.WriteLine("----------------A--------------");
        a.Display();
        Console.WriteLine("----------------B--------------");
        b.Display();
    }

 再来对比一下克隆的对象与原对象

// 测试A==B?
// 对任何的对象x,都有x.clone() !=x,即克隆对象与原对象不是同一个对象
Console.Write("A==B ? ");
Console.WriteLine(a == b);

// 对任何的对象x,都有x.clone().GetType()==x.GetType(),即克隆
Console.Write("A.GetType()==B.GetType() ? ");
Console.WriteLine(a.GetType() == b.GetType());

 总结

原型模式的优点:

  1. 原型模式在内存中复制对象,不会调用类的构造函数,性能优良。
  2. 简化了创建过程。在类初始化需要消耗非常多的资源的情况下,可以通过复制原型避免重复的初始化过程。
  3. 可以避免构造函数的约束。复制一个已存在的实例可以很好地保持现有实例的数据。
  4. 增加或减少产品类非常方便。客户端不需要因为创建者的更改而更改。

原型模式的缺点:

  1. 需要对每一个类都配置一个 clone 方法
  2. clone 方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违背了开闭原则。
  3. 当实现深拷贝时需要编写较为复杂的代码,而且当对象之间存在多重嵌套引用时,为了实现深拷贝,每一层都要提供深拷贝的实现方法。
  4. 必须维护对克隆对象的正确性,特别是在运行时状态变化时。

 

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

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

相关文章

胖小酱之补考也不会

小胖!补考还是要重视起来呀! 挂科了就要补考,如果不参加补考,毕业时重修该课程。补考不一定能过。挂科后一般都会有补考的,补考一般是在下个学期开学的前几周进行,因此如果自己挂科了要认真复习&#xff0…

mysql -sql触发器

1、创建触发器。 //创建一个触发器在给section关系插入后触发 create trigger timeslot_check1 after insert on sectionreferencing new row as nrow//对每个插入的行都执行for each row//when指定一个条件,仅对于满足条件的元组才会执行触发器剩余的部分when (nr…

SpringCloud入门实战(十四)Sentinel微服务流量防卫兵简介

📝 学技术、更要掌握学习的方法,一起学习,让进步发生 👩🏻 作者:一只IT攻城狮 ,关注我,不迷路 。 💐学习建议:1、养成习惯,学习java的任何一个技术…

零基础Java学习路线

预计阅读时间: 8分钟 目录 第一阶段: Java 基础第二阶段:数据库第三阶段: Java Web第四阶段:主流框架MavenGitSSM框架Spring Boot 第五阶段:服务器中间件RedisMQElasticsearch项目实践 第六阶段&#xff1a…

NAND Flash Program Operation: One Shot VS. Two Pass

讲解相关内容的文章很少,开始只搜索到本站一篇相关内容:浅谈NAND FLASH的两种编程方式 看完以后思路还不是很清晰,又发现了两篇FMS的主题演讲,在此简单总结分享。 Flash Memory Summit 2016, Thomas Parnell, IBM Res…

Spring-IoC-加强

目录 简略介绍 理解介绍 IoC的优点 Spring的IoC IoC是如何实现的 IoC能做什么 IoC和DI Spring IoC过程 为什么框架需要反射 Spring Bean的循环依赖问题 IoC简单实现 简略介绍 所谓的IoC(inversion of control),就是控制反转的意思…

Django基础三——视图函数

文章目录 一、基本了解1.1 Django内置函数1.2 http请求流程 二、HttpRequest对象(接受客户端请求)2.1 常用属性2.2 常用方法2.3 服务端接收URL参数2.4 QueryDict对象2.5 案例2.5.1 表单GET提交2.5.2 表单POST提交2.5.3 上传文件 三、HttpResponse对象&am…

气传导耳机品牌推荐?四大品牌气传导耳机推荐

​越来越多小伙伴开始使用气传导耳机了,面对市面上参差不齐的气传导耳机,导致很多小伙伴找不到适合自己的那款耳机了,面对这些问题,我整理了几款好用的气传导耳机给大家挑选和参考,希望都能找到心仪那款。 ①NANK南卡…

Docker-compose 容器编排

1. 是什么 Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器…

vscode+ros开发环境搭建

目录 介绍 前提 vscode安装 vscode插件安装 工作空间准备 打开vscode 创建catkin包 编写cpp代码 编译 运行 启动ros服务 监听话题 启动ros测试 介绍 ros开发是机器人开发中必不可少的工作,语言选择可以是c,也可以是python。工具的话,不能像wi…

Mysql 基本概念

数据库的组成 数据 数据是描述事务的符号记录;包括数字、文字、图形、图像、声音、档案记录等 以“记录“形式按统一的格式进行存储 表 将不同的记录以行和列的方式组合成了表 用来存储具体数据 数据库 它就是所有不同属性表的集合 以一定的组织方式存储的…

vue 简单实验 v-for 循环

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"list-rendering"><ol><li v-for"todo in todos">{{ todo.text }}</li></ol> </div> &…

数据API服务管理功能:解放数据潜力,提升业务效率

数据API服务的重要性 在数字化时代&#xff0c;数据被认为是企业的重要资产。数据API服务的管理功能能够有效帮助企业实现数据的整合和利用。通过合理的数据API服务管理&#xff0c;企业可以更好地解放数据潜力&#xff0c;提升业务效率。 ​ 解放数据潜力 数据API服务管理功…

解决git上传远程仓库时的大文件提交

在git中超过100M的文件会上传失败&#xff0c;而当一个文件超过50M时会给你警告&#xff0c;如下 warning: File XXXXXX is 51.42 MB; this is larger than GitHubs recommended maximum file size of 50.00 MB 解决这种问题&#xff0c;首先在项目的.git文件夹中找到.gitigno…

git push时,由于commit了大文件无法成功push的解决办法

2句命令解决&#xff01; 如图可以看见大文件的md5值&#xff0c;复制下来&#xff0c;以下命令会使用到 命令1&#xff1a; git rev-list --objects --all | grep b8d13387c0dfd7a8cec9ff0f6c8ded06eb21556f执行上面命令将得到&#xff0c;如下的输出&#xff0c;可以得知是…

C++基础Ⅱ变量

目录儿 4 变量4.1 原始数据类型字符 char整型 short整型 int整型 long整型 long long单精度浮点型 float双精度浮点型 double布尔型 bool 4.2 sizeof 关键字 5 指针和引用 4 变量 4.1 原始数据类型 原始数据类型是构建C程序的最基础数据类型 所有数据都是基于这些原始数据类型…

度加剪辑App的MMKV应用优化实践

作者 | 我爱吃海米 导读 移动端开发中&#xff0c;IO密集问题在很多时候没有得到充足的重视和解决&#xff0c;贸然的把IO导致的卡顿放到异步线程&#xff0c;可能会导致真正的问题被掩盖&#xff0c;前人挖坑后人踩。其实首先要想的是&#xff0c;数据存储方式是否合理&#x…

HQL解决连续三天登陆问题

1.背景 统计连续登录天数超过3天的用户&#xff0c;输出信息包括&#xff1a;用户id&#xff0c;登录天数&#xff0c;起始时间&#xff0c;结束时间&#xff1b; 2.准备数据 -- 建表 create table if not exists user_login_3days(user_id STRING,login_date date );--插入…

查询数据库字段信息 mysql

属性&#xff1a; SELECT TABLE_SCHEMA AS 库名, TABLE_NAME AS 表名, COLUMN_NAME AS 字段名, ORDINAL_POSITION AS 字段顺序, COLUMN_DEFAULT AS 默认值, IS_NULLABLE AS 是否为空, DATA_TYPE …

怎么把pdf文件变小?值得一看的文件压缩方法

现在很多平台对于上传的文件大小是有限制的&#xff0c;如果压缩成压缩包的形式发送&#xff0c;虽然可以减小一点体积&#xff0c;但对方无法直接打开预览文件内的内容&#xff0c;很不方便&#xff0c;怎么才能直接将PDF文件的体积压缩变小呢&#xff1f;下面就给大家汇总了几…