2009年4月21日星期二

设计模式:原型模式C#实现,源代码

原型模式也属于创建型模式中的一种,面向对象系统中,原型模式在创建一些有固定样子的对象非常有效,这一节主要总结各个网站(csdn、博客园等)对原型模式的探讨,并且给出一个C#实现原型设计模式的代码。
1、原型模式定义
(1)、用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.
(2)、 原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。
2、原型模式的优点
(1)、Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
(2)、我们在设计软件的时候,面临的产品类是动态变化的,这些产品类又具有一定得等级结构,如何封装这种变化,从而使这些容易变化的产品对象不随产品类变化,就需要原型模式了
3、原型模式的UML类图
4、C#代码实现
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace Prototype.Design.Pattern
{
class Program
{//运行主程序
static void Main(string[] args)
{
ConcretePotoType1 p1 = new ConcretePotoType1("I");
ConcretePotoType1 c1 = (ConcretePotoType1)p1.Clone();
Console.WriteLine("Cloned:{0}", c1.ID);
ConcretePotoType2 p2 = new ConcretePotoType2("II");
ConcretePotoType2 c2 = (ConcretePotoType2)p2.Clone();
Console.WriteLine("Cloned:{0}", c2.ID);
ColorManager colorm = new ColorManager();
colorm["red"] = new Color(255, 0, 0);
colorm["green"] = new Color(0, 255, 0);
colorm["blue"] = new Color(0, 0, 255);
colorm["angry"] = new Color(255, 54, 0);
colorm["peace"] = new Color(128, 211, 128);
colorm["flame"] = new Color(245, 124, 157);
string colorName = "red";
Color cc1 = (Color)colorm[colorName].Clone();
cc1.Display();
colorName = "flame";
cc1 = (Color)colorm[colorName].Clone();
cc1.Display();
Console.ReadKey();
}
}
//抽象原型
public abstract class PotoType
{
private string id;
public PotoType(string id)
{this.id = id;}
public string ID
{get { return id; }}
abstract public PotoType Clone();
}
//具体实现的原型
public class ConcretePotoType1 : PotoType
{
public ConcretePotoType1(string id) : base(id) { }
public override PotoType Clone()
{
return (PotoType)this.MemberwiseClone();
}
}
//具体实现的原型
public class ConcretePotoType2 : PotoType
{
public ConcretePotoType2(string id) : base(id) { }
public override PotoType Clone()
{
return (PotoType)this.MemberwiseClone();
}
}
#region 扩展性的模式
public abstract class ColorPrototype
{
public abstract ColorPrototype Clone();
}
public class Color : ColorPrototype
{
private int red, green, blue;
public Color(int red, int green, int blue)
{
this.red = red;this.green = green;this.blue = blue;
}
public override ColorPrototype Clone()
{
return (ColorPrototype)this.MemberwiseClone();
}
public void Display()
{
Console.WriteLine("RGB values are: {0},{1},{2}",
red, green, blue);}
}
public class ColorManager
{
Hashtable colors = new Hashtable();
public ColorPrototype this[string name]
{
set { colors.Add(name, value); }
get { return (ColorPrototype)colors[name]; }
}
}
#endregion
}

没有评论: