2009年10月9日星期五

Prototype 模型设计模式

创建一个实例(Instance)可以有很多种方法,最简单的就是new 一个实例。但是很多情况下,New不够灵活,需要用其他的方式创建实例。比如为了保证只有一个实例被创建,有Singleton设计。为了保证实例能正确的创建和组装有抽象工厂模式(Abstrac Factory)。
有时候创建实例很费时费力且要多次创建,比如有的类在构造函数中需要读取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

没有评论:

发表评论