9. 原型模式
约 582 字大约 2 分钟
2026-03-04
原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式(Prototype)结构图
原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。
通常的代码每NEW一次,都需要执行一次构造函数,如果构造函数的执行时间很长,那么多次的执行这个初始化操作就实在是太低效了。
一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高。
原型模式不用重新初始化对象,而是动态地获得对象运行时的状态。
抽象原型类:
public abstract class Prototype
{
private string id;
public Prototype(string id)
{
this.id = id;
}
public string Id
{
get { return id; }
}
public abstract Prototype Clone();
}具体原型类:
public class ConcretePrototype1 : Prototype
{
public ConcretePrototype1(string id) : base(id)
{
}
public override Prototype Clone()
{
// 浅拷贝
return (Prototype)this.MemberwiseClone();
}
}客户端代码:
class Program
{
static void Main(string[] args)
{
ConcretePrototype1 p1 = new ConcretePrototype1("1");
// 通过复制已有对象来创建新对象,而不是通过 new。
ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();
Console.WriteLine("Cloned: {0}", c1.Id);
Console.Read();
}
}浅拷贝与深拷贝
浅拷贝:如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象:因此,原始对象及其复本引用同一对象。被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
深拷贝:但我们可能更需要这样的一种需求,把要复制的对象所引用的对象都复制一遍。比如我们希望是a、b、c三个引用的对象都是不同的,复制时就一变二,二变三,此时,我们就叫这种方式为‘深复制’,深复制把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
