首页 > 其他分享 >重温设计模式 --- 原型模式

重温设计模式 --- 原型模式

时间:2023-07-10 19:11:13浏览次数:50  
标签:prototype 对象 创建 clone 重温 --- 原型 设计模式 Clone

引言

原型模式是一种创建型设计模式,它允许我们创建一个对象的副本,而不需要显式地使用构造函数来创建一个新的对象。这种模式通常用于创建那些具有复杂创建过程或需要大量资源的对象。

在原型模式中,我们首先定义一个原型接口,该接口包含一个克隆方法。然后我们创建一个原型对象,该对象实现了原型接口并提供了自己的克隆方法。最后,我们可以使用原型对象的克隆方法来创建新的对象,而无需重新实例化原型对象。

IClone接口

需要定义一个IClone接口。这个类中应该包含一个 Clone 方法,用于克隆自身。

public interface IClone<T> where T : class
{
    public T Clone();
}

原型类

定义一个具体原型类,它实现IClone接口,并实现了Clone方法

public class ConcretePrototype : IClone<ConcretePrototype>
{
    private string _name;

    public ConcretePrototype(string name)
    {
        _name = name;
    }

    public ConcretePrototype Clone()
    {
        return (ConcretePrototype)this.MemberwiseClone();
    }

    public void SetName(string name)
    {
        _name = name;
    }

    public void PrintName()
    {
        Console.WriteLine($"Name: {_name}");
    }
}

在具体原型类中,我们实现了 Clone 方法,并使用了 MemberwiseClone 方法来复制对象。此外,我们还添加了一个 SetName 方法和一个 PrintName 方法,用于演示对象的复制和修改。

:::tip{title="提示"}

  1. 使用 Clone 方法来复制对象。需要注意的是,在复制对象时,我们需要使用 MemberwiseClone 方法或其他深拷贝方法来复制对象本身,而不是复制它的引用。此外,如果需要复制对象的引用类型成员,我们需要在具体原型类中对它们进行深拷贝
  2. 原型模式是在内存二进制流的拷贝,要比直接new一个对象性能好很多,特别是要在一个循环体内产生大量的对象时,原型模式可以更好地体现其优点。
  3. 执行Clone方法复制对象时,不执行其构造函数
    :::

接下来,我们可以使用具体原型类来创建新的对象。具体地说,我们可以先创建一个原型对象,然后调用它的 Clone 方法来复制它,并修改复制出的对象的状态。

ConcretePrototype prototype = new ConcretePrototype("prototype");

ConcretePrototype clone = (ConcretePrototype)prototype.Clone();

prototype.PrintName(); // Name: prototype

clone.PrintName(); // Name: prototype

clone.SetName("clone");

prototype.PrintName(); // Name: prototype

clone.PrintName(); // Name: clone

在这段代码中,我们首先创建了一个名为 prototype 的具体原型对象,并输出它的名字。然后,我们调用了 prototypeClone 方法来复制它,并将结果保存在名为 clone 的变量中。接着,我们修改了 clone 的名字为 "clone",并分别输出 prototypeclone 的名字,以证明它们是不同的对象。

总结

原型模式适用于以下情况:

  • 当需要创建的对象的类型由程序在运行时确定时,原型模式比工厂模式更加灵活。
  • 当需要创建的对象的创建过程较为复杂,或者需要初始化较长时间时,原型模式可以避免重复创建对象的开销。
  • 当需要创建的对象与其它对象具有相似的属性和方法时,原型模式可以避免重复编写相同的代码。

标签:prototype,对象,创建,clone,重温,---,原型,设计模式,Clone
From: https://www.cnblogs.com/pandefu/p/17536308.html

相关文章

  • AT_agc062_a [AGC062A] Right Side Character 对自己的警告--zhengjun
    自己推性质的能力是真的差。如果最后一个字符是A,那么答案就是A(分为全是A和存在B两种情况证明即可)否则如果最后一个字符是B,检查是否会变为以A结尾如果原串为AA...ABB...B的话,答案为B否则最后的B会不断减少直到前面的A成为最后一个字符做了1h才做出......
  • 2023-07-10:Kafka如何做到消息不丢失?
    2023-07-10:Kafka如何做到消息不丢失?答案2023-07-10:Kafka采用多种机制来确保消息的不丢失,其中包括副本机制、ISR(In-SyncReplicas)机制以及ACK机制等。1.副本机制Kafka通过副本机制来确保消息不会丢失。在Kafka中,每个分区都可以配置多个副本,每个副本保存分区的完整拷贝。当一个......
  • 00-平衡车
    一、平衡车项目硬件准备1.电机驱动模块TB6612VM-------12VVCC-------5VSTBY------5VPWMA----PA3PWMB----PA2AIN1----PB14AIN2----PB15BIN1----PB13BIN2----PB12AO1---M+AO2---M-BO1---M-BO2---M+2.编码电机电机M1M+---BO2M----BO1A---PA6——TIM3_CH1 B-......
  • Largest-Smallest-Cyclic-Shift题解
    题目链接本题码量不大,但是事实上是一道极其难想的思维题。题目描述你有\(a\)个a,\(b\)个b,\(c\)个c。要求用这\(a+b+c\)个字母拼接成一个字符串,使得这个字符串的最小表示法在所有能拼成的字符串中最大。补充:最小表示法,将一个字符串的最后一个字符放到首位,重复这个操作,......
  • AT-abc214-g题解
    题目描述给定两个排列\(p,q\),要求统计满足\(\foralli,r_i\not=p_i,r_i\not=q_i\)的排列\(r\)的数量。对\(1000000007\)取模数据范围\(n\le3000\)。solution本题要求统计数量,反正我想了半天没想到怎么正向统计(bushi),因此我们考虑容斥。设\(h_i\)为只看其中......
  • NOIP2013-2023题解
    本文章主要是为了不想卷题的时候不是特别颓废而准备本文章是为了总结NOIP最近的题目(为了今年NOIP做准备),目前还没写完,尽量做的全面一些。2013积木大赛给定一个长度为\(n\)的序列\(h_i\),初始有一个全为\(0\)的序列,每次操作可以任意选择\(L,R\),使得\([L,R]\)这段区......
  • CF1545D-题解
    题目链接题目描述有\(n\)个人和\(k\)个间隔相同时间的时刻,每个人都向正方向做匀速直线运动。给出每个时刻(\(0\simk-1\))的所有人的坐标集合(无序),在这\(nk\)个数中有一个数是错误的,找出这个错误的数并将其改正。数据范围:\(5\len\le1000\),\(7\lek\le1000\)。加......
  • spring-boot-webflux-servlet-websocket-2.x 示例响应式编程
    这里是一个使用SpringBootWebFlux结合Servlet和WebSocket的示例代码:首先,确保在pom.xml文件中添加以下依赖:<dependencies><!--SpringBootWebFlux--><dependency><groupId>org.springframework.boot</groupId><artifactId>sprin......
  • 玄学记录-1
    整个系列的前言知周所众,OI是一门玄学(逃)。我指会出现玄学的问题。因此这个系列来记录一些我觉得很玄学、很解释不清楚的东西。如果你会,你可以认为我很菜,并且给出玄学的解释。如果你想你不会,你就可以想象成你是欧皇,没有碰到过这种情况。如果你也碰到过,那么很好,这件事情就足以称为......
  • web安全学习日志---xss漏洞(跨站脚本攻击)
    1.反射性xss(reflacted) 仅执行一次,非持久型。主要存在于攻击者将恶意脚本附加到url的参数中,发送给受害者,服务端未经严格过滤处理而输出在用户浏览器中,导致浏览器执行代码数据。利用场景:直接插入JS代码,修改url参数  攻<script>alert('hack')</script>防$name=str_replac......