2010年9月28日

设计模式-原型模式(Prototype)

设计模式-原型模式(Prototype)

简述

  原型模式最后一个要介绍的创建型模式。它在创建大量拥有相同状态的对象时使用起来非常方便。

功能

  用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象(Baidu 到的相当专业)。

何处使用

  我们把类当作对象的模板,给类的属性赋予值时就产生了一个具体的对象,如果需要创建大量状态相同的对象时,传统的方式需要一个一个对象重新赋值,但是如果我们采取原型模式的话,这样的工作将变得非常的简单。它提供一个克隆的方法,可以方便的让用户对每个对象进行复制并赋予另外对象相同的状态,其实这一方法在 .Net 中就已经提供了,所以我们重写起来也相当方便。举例方面我想就不用了,克隆对象应该很好理解。

设计

  我们直接完成设计图纸吧,抽象的原型类拥有一个可以克隆当前对象的公共方法,其衍生出来的子类重写了它的克隆方法,使其能够真正实现克隆当前对象的方法。Prototype

实现

  .Net 框架中,提供了 MemberwiseClone()  一个方法可以让我们对当前对象进行复制,此方法的访问级别为受保护的,所以需要重新定义一个公共 Clone() 方法使其外部可以访问,我们的代码可以这样实现(非常感谢网上提供代码的人):

01using System;
02 
03public class Test
04{
05    static void Main()
06    {
07        ConcretePrototype1 p1 = new ConcretePrototype1("I");
08        ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();
09        Console.WriteLine ("Cloned: {0}", c1.Id);
10         
11        ConcretePrototype2 p2 = new ConcretePrototype2("II");
12        ConcretePrototype2 c2 = (ConcretePrototype2)p2.Clone();
13        Console.WriteLine ("Cloned: {0}", c2.Id);
14    }
15}
16 
17public abstract class Prototype
18{
19    private string id;
20    public string Id
21    {
22        get{ return id; }
23    }
24 
25    public Prototype(string id)
26    {
27        this.id = id;
28    }
29 
30    public abstract Prototype Clone();
31}
32 
33public class ConcretePrototype1 : Prototype
34{
35    public ConcretePrototype1(string id) : base(id) { }
36    public override Prototype Clone()
37    {
38        return (Prototype)this.MemberwiseClone();
39    }
40}
41 
42public class ConcretePrototype2 : Prototype
43{
44    public ConcretePrototype2(string id) : base(id) { }
45    public override Prototype Clone()
46    {
47        return (Prototype)this.MemberwiseClone();
48    }
49}

  看来在 .Net 框架下我们很容易就能够实现这一模式。



没有评论:

发表评论