原型模式:通过给出一个原型对象来指明所要创建的对象类型,然后用复制这个原型对象的办法创建出更多的同类型对象。
原型模式类图:
类图说明:
客户(Client)角色:客户类提出创建对象的请求。
抽象原型(Prototype)角色:这是一个抽象角色,通常由一个 C#接口或抽象类实现。此角色给出所有的具体原型类所需的接口。在 C#中,
抽象原型角色通常实现了 ICloneable 接口。
具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象原型角色所要求的接口。
示例代码:
class Program { static void Main(string[] args) { 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); Console.ReadKey(); } } abstract class ProtoType { private string id; public ProtoType(string id) { this.id = id; } public string Id { get { return id; } } abstract public ProtoType Clone(); } class ConcreteProtoType1 : ProtoType { public ConcreteProtoType1(string id) : base(id) { } public override ProtoType Clone() { return (ProtoType)this.MemberwiseClone(); } } class ConcreteProtoType2 : ProtoType { public ConcreteProtoType2(string id) : base(id) { } public override ProtoType Clone() { return (ProtoType)this.MemberwiseClone(); } }
运行结果:
这个例子实现了一个浅拷贝。其中 MemberwiseClone()方法是 Object类的一个受保护方法, 实现了对象的浅拷贝。
带 Prototype Manager的原型模
类图:
客户(Client)角色:客户端类向原型管理器提出创建对象的请求。
抽象原型(Prototype)角色:这是一个抽象角色,通常由一个 C#接口或抽象类实现。此角色 给出所有的具体原型类所需的接口。在 C#中,抽象原型角色通常实现了 ICloneable 接口。
具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要 求的接口。
原型管理器(Prototype Manager)角色:创建具体原型类的对象,并记录每一个被创建的对 象。
抽象原型(Prototype)角色:这是一个抽象角色,通常由一个 C#接口或抽象类实现。此角色 给出所有的具体原型类所需的接口。在 C#中,抽象原型角色通常实现了 ICloneable 接口。
具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要 求的接口。
原型管理器(Prototype Manager)角色:创建具体原型类的对象,并记录每一个被创建的对 象。
示例代码:
class PrototypeManager { static void Main(string[] args) { ColorManager colorManager = new ColorManager(); colorManager["red"] = new Color(255, 0, 0); colorManager["green"] = new Color(0, 255, 0); colorManager["blue"] = new Color(0, 0, 255); colorManager["angry"] = new Color(255,54,0); colorManager["peace"] = new Color(128,211,128); colorManager["flame"] = new Color(211,34,20); string colorName = "red"; Color c1 = (Color)colorManager[colorName].Clone(); c1.Display(); colorName = "peace"; Color c2 = (Color)colorManager[colorName].Clone(); c2.Display(); colorName = "flame"; Color c3 = (Color)colorManager[colorName].Clone(); c3.Display(); Console.ReadKey(); } } abstract class ColorPrototype { public abstract ColorPrototype Clone(); } 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); } } class ColorManager { Hashtable colors = new Hashtable(); public ColorPrototype this[string name] { get { return (ColorPrototype)colors[name]; } set { colors.Add(name, value); } } }
运行结果:
Prototype 模式的优点包括
1、Prototype 模式允许动态增加或减少产品类。由于创建产品类实例的方法是产批类内部具有 的,因此增加新产品对整个结构没有影响。
2、Prototype 模式提供了简化的创建结构。工厂方法模式常常需要有一个与产品类等级结构相 同的等级结构,而 Prototype 模式就不需要这样。
3、Portotype 模式具有给一个应用软件动态加载新功能的能力。由于 Prototype 的独立性较 高,可以很容易动态加载新功能而不影响老系统。
4、产品类不需要非得有任何事先确定的等级结构, 因为 Prototype 模式适用于任何的等级结构。
Prototype 模式的缺点:
Prototype 模式的最主要缺点就是每一个类必须配备一个克隆方法。而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,
但对已有的类进行改造时,不一定是件容易的事。