您的位置:首页 > 编程语言

设计模式实例与代码:Prototype模式

2012-04-12 00:34 627 查看
意图/定义:通过复制一个原型的实例来创建新的对象,而不是新建新实例,被复制的实例称之谓原型

问题:当新建一个实例步骤较多或代价较高,而复制一个已有实例比较快捷或代价较低

解决方案:为对象原型提供复制自己的操作

参与者与协作者:具体原型需要实现复制自己对象的操作,客户只请求已有原型复制其自身,即得到新的实例

效果:简化了客户对于创建新对象所需要了解的知识,客户不再需要重新自己费劲的创建一个新实例(如传递各种初始化参数)

实现:创建需要可以自我复制的类,为这些类提供clone实现,使得其可以以合适的方式返回自己的一个复本,当需要新对象的时候,从原型实例复制即可。



结构性的示例代码如下:

using System;

namespace Prototype
{
/// <summary>
/// MainApp startup class for Structural
/// Prototype Design Pattern.
/// </summary>
class MainApp
{
/// <summary>
/// Entry point into console application.
/// </summary>
static void Main()
{
// Create two instances and clone each

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);

// Wait for user
Console.ReadKey();
}
}

/// <summary>
/// The 'Prototype' abstract class
/// </summary>
abstract class Prototype
{
private string _id;

// Constructor
public Prototype(string id)
{
this._id = id;
}

// Gets id
public string Id
{
get { return _id; }
}

public abstract Prototype Clone();
}

/// <summary>
/// A 'ConcretePrototype' class
/// </summary>
class ConcretePrototype1 : Prototype
{
// Constructor
public ConcretePrototype1(string id)
: base(id)
{
}

// Returns a shallow copy
public override Prototype Clone()
{
return (Prototype)this.MemberwiseClone();
}
}

/// <summary>
/// A 'ConcretePrototype' class
/// </summary>
class ConcretePrototype2 : Prototype
{
// Constructor
public ConcretePrototype2(string id)
: base(id)
{
}

// Returns a shallow copy
public override Prototype Clone()
{
return (Prototype)this.MemberwiseClone();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: