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