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

简述

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

功能

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

何处使用

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

设计

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

实现

  .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

posted @ 2010-09-27 23:19  佳佳李  阅读(1225)  评论(4编辑  收藏  举报