有时候创建实例很费时费力且要多次创建,比如有的类在构造函数中需要读取XML文件设置很多参数,且要创建多个这样的实例。就需要用到Prototype设计模式,只需要创建一个类的实例作为模型,创建其他这个类的实例的时候,只需要Clone这个实例就可以了。在实现上,除了构造函数外,要提供一个Clone函数,在C#或Java中系统有提供好的Clone函数,只需调用一下就可以了。
下面这个例子中,抽象类Prototype的构造函数中,需要调用readXML,假设这个函数调用非常复杂和耗费时间。ConcretePrototype1 这个类的实例生成后,只需要把它作为模型,克隆一个新的实例,而不需要去重新构建。
using System;
namespace Structural
{
// MainApp test application
class MainApp
{
static void Main()
{
// Create two instances and clone each
ConcretePrototype1 p1 = new ConcretePrototype1("I");
ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();
Console.Write(p1.Id + "\n");
Console.Write(c1.Id + "\n");
// Wait for user
Console.Read();
}
}
// "Prototype"
abstract class Prototype
{
private string id;
// Constructor
public Prototype(string id)
{
this.id = id;
readXML();
}
// Property
public string Id
{
get { return id; }
}
public abstract Prototype Clone();
protected abstract void readXML();
}
// "ConcretePrototype1"
class ConcretePrototype1 : Prototype
{
// Constructor
public ConcretePrototype1(string id)
: base(id)
{
}
public override Prototype Clone()
{
// Shallow copy
return (Prototype)this.MemberwiseClone();
}
protected override void readXML()
{
Console.Write("read xml \n" );
}
}
}
执行结果:
read xml
I
I
没有评论:
发表评论