C# 创建型模式(Creational Pattern)之原型设计模式(Prototype Design Pattern)

C#中的原型设计模式与示例

在本文中,我将通过示例讨论C#中原型设计模式。该原型设计模式属于创建型设计模式的范畴。 

什么是原型设计模式?

根据GoF定义,“原型设计模式指定了使用原型实例创建的对象类型,并通过复制此原型来创建新对象”。

为了简化上面的定义,我们可以说,原型设计模式为我们提供了一种从对象的现有实例创建新对象的方法。这意味着它将现有对象及其数据克隆到新对象中。如果我们对克隆对象(即新对象)进行了任何更改,那么它不会影响原始对象。

注意:原型设计模式在其他创建型设计模式中是独一无二的,因为它不需要类,而是需要一个最终对象。

了解C#中的原型设计模式:

让我们通过一个例子来理解原型设计模式。在C#中,当我们尝试使用赋值(=)运算符将一个对象复制到另一个对象时,两个对象将共享相同的内存地址。原因是赋值运算符(=)复制引用,而不是对象,除非存在值类型字段。该运算符将始终复制参考,而不是实际对象。请看下面的图片。

如上图所示,我们有一个Employee类。然后,我们创建Employee类(即Emplpyee_1)的实例,并设置其Name和Department属性。然后,通过分配现有员工对象(即Emplpyee_1)来创建另一个员工实例(即Emplpyee_2)。当我们更改Emplpyee_2的Name时,它也会更改Emplpyee_1的Name。 

完整代码如下。

using System;
using System.Security.Cryptography;

namespace copy
{
    class Program
    {
        static void Main(string[] args)
        {
            Employee Emplpyee_1 = new Employee();
            Emplpyee_1.Name = "Robin";
            Emplpyee_1.Department = "IT";

            Employee Emplpyee_2 = Emplpyee_1;
            Emplpyee_2.Name = "Fiona";

            Console.WriteLine("Emplpyee_1 结果如下: ");
            Console.WriteLine("Name: " + Emplpyee_1.Name + ", Department: " + Emplpyee_1.Department);
            Console.WriteLine("Emplpyee_2 结果如下: ");
            Console.WriteLine("Name: " + Emplpyee_2.Name + ", Department: " + Emplpyee_2.Department);
            Console.Read();
        }

        public class Employee
        {
            public string Name { get; set; }
            public string Department { get; set; }
        }
    }
}

输出:

了解对象克隆:

当我们谈论对象克隆时,这意味着它跟值的调用有关。因此,如果我们对一个对象进行任何更改,那么它将不会影响另一个对象。让我们看看如何将对象克隆到另一个对象。为此,C#提供了一种方法(即MemberwiseClone),该方法将创建对象的新完整副本。

如上图所示,我们在Employee类中创建了一个方法,即GetClone,作为该方法的一部分,我们使用MemberwiseClone方法返回了一个克隆对象。然后,从客户端代码开始,首先我们创建一个Employee类的新实例,并为属性分配一些值。接下来,我们通过调用GetClone方法来创建第二个对象,该方法又返回Emplpyee_1对象的新完整副本。现在,两个对象(即Emplpyee_1和Emplpyee_2)都是独立的,并且如果我们对任何对象进行任何更改,它将不会影响其他对象。

完整的示例代码如下。

using System;
using System.Security.Cryptography;

namespace copy
{
    class Program
    {
        static void Main(string[] args)
        {
            Employee Emplpyee_1 = new Employee();
            Emplpyee_1.Name = "Robin";
            Emplpyee_1.Department = "IT";

            //Employee Emplpyee_2 = Emplpyee_1;
            Employee Emplpyee_2 = Emplpyee_1.GetClone();
            Emplpyee_2.Name = "Fiona";

            Console.WriteLine("Emplpyee_1 结果如下: ");
            Console.WriteLine("Name: " + Emplpyee_1.Name + ", Department: " + Emplpyee_1.Department);
            Console.WriteLine("Emplpyee_2 结果如下: ");
            Console.WriteLine("Name: " + Emplpyee_2.Name + ", Department: " + Emplpyee_2.Department);
            Console.Read();
        }

        public class Employee
        {
            public string Name { get; set; }
            public string Department { get; set; }

            public Employee GetClone()
            {
                return (Employee)this.MemberwiseClone();
            }
        }
    }
}

输出:

要记住的要点:

  1. MemberwiseClone方法是System.Object类的一部分,它创建给定对象的浅表副本。 
  2. MemberwiseClone方法仅将对象的非静态字段复制到新对象
  3. 在复制过程中,如果字段是值类型,则会对该字段执行逐位复制。如果字段是引用类型,则复制引用,但不复制被引用的对象。

在进行对象克隆时,我们需要了解两件事,即浅拷贝和深拷贝。因此,在下一篇文章中,将通过示例讨论C#中的深拷贝和浅拷贝。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值