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;
}
}
结论 🔗
搬砖愉快!