陈巧倩

设计模式-原型模式

· 163 words · 1 minutes to read
Categories: CSharp
Tags: Design Pattern

Factory Method Pototype原型模式属于创建型设计模式,用于通过拷贝模型来创建新的对象。

Design Pattern:Pototype 🔗

基本介绍 🔗

构成 🔗

  • Prototype:原型类,声明一个用于克隆自身的接口。
  • ConcretePrototype:实际原型类,实现用于克隆自身的原型接口的类。

优点 🔗

  • 避免了创建新实例的复杂性。
  • 可以动态增加或删除产品类。
  • 通过改变值或结构指定新对象。
  • 减少子类化,允许克隆现有对象而不是要求工厂创建新实例。原型模式消除了为创建产品引入子类化的需要。

缺点 🔗

  • 每个类必须配备一个克隆方法。
  • 对于值类型和引用类型,深拷贝和浅拷贝必须理解到位。

实例 🔗

C#中原型模式的实例,下面我们又来到了富士康的手机模具车间。

  • Prototype
/// <summary>
/// 手机壳模型
/// </summary>
public abstract class ShouJiKePrototype
{
    public abstract ShouJiKePrototype Clone();
}
  • ConcretePrototype
/// <summary>
/// 华为手机壳
/// </summary>
public sealed class HuaWeiShouJiKePrototype : ShouJiKePrototype
{
    public override ShouJiKePrototype Clone()
    {
        return (HuaWeiShouJiKePrototype)this.MemberwiseClone();
    }
}

实际运行:

ShouJiKePrototype prototype = new HuaWeiShouJiKePrototype();
ShouJiKePrototype prototype1 = prototype.Clone();
ShouJiKePrototype prototype2 = prototype.Clone();
ShouJiKePrototype prototype3 = prototype.Clone();

额外拓展 🔗

  • MemberwiseClone介绍
    • MemberwiseClone 方法是System.Object类的一部分,它创建给定对象的浅表副本。
    • MemberwiseClone 方法只是将对象的非静态字段复制到新对象中。
    • 复制过程中,如果某个字段是值类型,则对该字段进行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象。
  • 深拷贝和浅拷贝
    • 浅拷贝:从现有对象创建克隆对象,然后将现有对象的值类型字段复制到新对象。但是对于引用类型属性,它只会复制引用,而不是实际对象本身。因此,在引用类型的情况下,现有对象和克隆对象引用相同的内存位置。
    • 深拷贝:从现有对象创建克隆对象,然后将现有对象的字段复制到新创建的克隆对象。如果该字段是值类型,则将执行该字段的逐位复制。如果字段是引用类型,则将创建引用对象的新副本。这意味着,与浅拷贝不同,在深拷贝的情况下,现有对象和克隆对象的引用类型属性都具有不同的内存位置。
public class AgeInfo
{
    public int Number;

    public AgeInfo(int age)
    {
        Number = age;
    }
}

public class Person
{
    public string Name;
    public AgeInfo Age;

    /// <summary>
    /// 浅拷贝
    /// </summary>
    /// <returns></returns>
    public Person ShallowCopy()
    {
        return (Person) this.MemberwiseClone();
    }
    /// <summary>
    /// 深拷贝
    /// </summary>
    /// <returns></returns>
    public Person DeepCopy()
    {
        Person otherPerson = (Person) this.MemberwiseClone();
        otherPerson.Age = new AgeInfo(Age.Number);
        otherPerson.Name = String.Copy(Name);
        return otherPerson;
    }
}

结论 🔗

搬砖愉快!