设计模式-原型模式(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
浙公网安备 33010602011771号