赞
踩
原型模式允许一个对象通过复制自身来创建新的对象。这种模式提供了一种创建对象的快捷方式,尤其适用于创建代价较高的对象。
原型模式的结构包含以下角色:
Prototype
接口并能够克隆自身。Prototype
对象复制自身来创建新对象。UML 类图
+----------------------+ +-------------------------+
| Prototype |<---------------| ConcretePrototype |
+----------------------+ +-------------------------+
| + Clone(): Prototype | | + Clone(): Prototype |
+----------------------+ +-------------------------+
/|\ |
| |
| |
+---------------------+ +---------------------------------+
| Client | | AnotherConcretePrototype |
+---------------------+ +---------------------------------+
| + Operation() | | + Clone(): Prototype |
+---------------------+ +---------------------------------+
原型模式的核心在于实现对象的深拷贝或浅拷贝。以下是一个实现原型模式的简单示例,其中我们克隆一个对象来创建新的对象。
原型接口
// 原型接口
public abstract class Prototype
{
public abstract Prototype Clone();
}
具体原型类
// 具体原型类
public class ConcretePrototype : Prototype
{
public string Name { get; set; }
public ConcretePrototype(string name)
{
Name = name;
}
// 实现克隆方法
public override Prototype Clone()
{
return (Prototype)this.MemberwiseClone(); // 浅拷贝
}
}
客户端代码
class Program
{
static void Main(string[] args)
{
// 创建一个原型对象
ConcretePrototype prototype1 = new ConcretePrototype("Prototype 1");
// 克隆原型对象
ConcretePrototype clonedPrototype = (ConcretePrototype)prototype1.Clone();
// 显示克隆对象的属性
Console.WriteLine("Original Prototype Name: " + prototype1.Name);
Console.WriteLine("Cloned Prototype Name: " + clonedPrototype.Name);
// 修改克隆对象的属性
clonedPrototype.Name = "Cloned Prototype 1";
Console.WriteLine("\nAfter modification:");
Console.WriteLine("Original Prototype Name: " + prototype1.Name);
Console.WriteLine("Cloned Prototype Name: " + clonedPrototype.Name);
}
}
在这个例子中,ConcretePrototype
是具体的原型类,实现了 Clone
方法。Clone
方法使用 MemberwiseClone
来执行浅拷贝,这意味着对象的成员变量会被复制,但对象的引用类型成员变量依然指向同一个内存地址。
浅拷贝与深拷贝:
深拷贝的实现
要实现深拷贝,可以在 Clone
方法中手动复制引用类型的成员变量,或者通过序列化和反序列化来实现。
// 实现深拷贝的具体原型类
[Serializable]
public class DeepConcretePrototype : Prototype
{
public string Name { get; set; }
public List<string> Features { get; set; }
public DeepConcretePrototype(string name, List<string> features)
{
Name = name;
Features = features;
}
public override Prototype Clone()
{
// 深拷贝:通过序列化和反序列化
using (MemoryStream stream = new MemoryStream())
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, this);
stream.Seek(0, SeekOrigin.Begin);
return (Prototype)formatter.Deserialize(stream);
}
}
}
优点:
减少对象创建的成本: 尤其是当对象的创建代价很高时,通过克隆一个现有的对象可以减少资源消耗。
避免复杂对象的重复创建: 当创建复杂对象需要设置大量参数或步骤时,原型模式可以避免重复工作。
易于扩展: 可以通过继承现有原型类来扩展新的克隆行为,而无需修改现有代码。
缺点:
深拷贝实现复杂: 如果对象包含复杂的引用关系,深拷贝的实现可能会很复杂。
容易引起混淆: 如果在系统中有多个原型对象,可能会导致代码的可读性降低,增加理解难度。
原型模式非常适合在对象创建复杂或成本较高的场景下使用,它通过克隆来简化对象的创建过程并提高性能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。