设计模式-原型模式(Prototype)
简述
原型模式最后一个要介绍的创建型模式。它在创建大量拥有相同状态的对象时使用起来非常方便。
功能
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象(Baidu 到的相当专业)。
何处使用
我们把类当作对象的模板,给类的属性赋予值时就产生了一个具体的对象,如果需要创建大量状态相同的对象时,传统的方式需要一个一个对象重新赋值,但是如果我们采取原型模式的话,这样的工作将变得非常的简单。它提供一个克隆的方法,可以方便的让用户对每个对象进行复制并赋予另外对象相同的状态,其实这一方法在 .Net 中就已经提供了,所以我们重写起来也相当方便。举例方面我想就不用了,克隆对象应该很好理解。
设计
我们直接完成设计图纸吧,抽象的原型类拥有一个可以克隆当前对象的公共方法,其衍生出来的子类都重写了它的克隆方法,使其能够真正实现克隆当前对象的方法。
实现
.Net 框架中,提供了 MemberwiseClone() 一个方法可以让我们对当前对象进行复制,此方法的访问级别为受保护的,所以需要重新定义一个公共 Clone() 方法使其外部可以访问,我们的代码可以这样实现(非常感谢网上提供代码的人):
using System; public class Test { static void Main() { ConcretePrototype1 p1 = new ConcretePrototype1("I"); ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone(); Console.WriteLine ("Cloned: {0}", c1.Id); ConcretePrototype2 p2 = new ConcretePrototype2("II"); ConcretePrototype2 c2 = (ConcretePrototype2)p2.Clone(); Console.WriteLine ("Cloned: {0}", c2.Id); } } public abstract class Prototype { private string id; public string Id { get{ return id; } } public Prototype(string id) { this.id = id; } public abstract Prototype Clone(); } public class ConcretePrototype1 : Prototype { public ConcretePrototype1(string id) : base(id) { } public override Prototype Clone() { return (Prototype)this.MemberwiseClone(); } } public class ConcretePrototype2 : Prototype { public ConcretePrototype2(string id) : base(id) { } public override Prototype Clone() { return (Prototype)this.MemberwiseClone(); } }
看来在 .Net 框架下我们很容易就能够实现这一模式。
To be continued! @ Design Patterns