一、原型模式簡介(Brief Introduction)
原型模式(Prototype Pattern):用原型實例指定創建對象的種類,並通過拷貝這些原型創建新的對象。
Specify the kind of objects to create using a prototypical instance, and create new objects by copying this prototype。
淺復制與深復制區別:
淺復制,被復制的所有變量都還有與原來對象相同的值,而所有的對其他對象的引用都仍然指向原來的對象。
深復制,把引用對象的變量指向復制過的新對象,而不是原有的被引用的對象。
Net命名空間System提供了一個IConeable接口,此接口只有一個方法Clone(),只需要實現這個接口就可以實現原型模式(Prototype Pattern)了。
二、解決的問題(What To Solve)
當一個對象生成不是通過New而是通過復制舊對象的時候,可以考慮使用原型模式。
三、原型模式分析(Analysis)1、原型模式結構
Prototype類:原型類 Clone()方法:克隆自身的接口。
ConcretePrototypeA、ConcretePrototypeA類:原型類的具體實現。克隆一個自身的操作。
2、代碼
1、原型抽象類Prototype
/// <summary>
/// 抽象原型模式類
/// </summary>
public abstract class Prototype
{
private string _id;
public Prototype(string id)
{
this.Id = id;
}
public string Id
{
get { return _id; }
set { _id = value; }
}
public abstract Prototype Clone();
}
2、具體實現類ConcretePrototypeA和ConcretePrototypeB
public class ConcretePrototypeA : Prototype
{
public ConcretePrototypeA(string id)
: base(id)
{ }
/// <summary>
/// Returns a shallow copy 淺拷貝
/// </summary>
/// <returns>a shallow copy</returns>
public override Prototype Clone()
{
return (Prototype)this.MemberwiseClone();
}
}
public class ConcretePrototypeB:Prototype
{
public ConcretePrototypeB(string id)
: base(id)
{ }
/// <summary>
/// a shallow copy
/// </summary>
/// <returns>淺拷貝</returns>
public override Prototype Clone()
{
return (Prototype)this.MemberwiseClone();
}
}
2、客戶端代碼
static void Main(string[] args)
{
Prototype pA = new ConcretePrototypeA("A");
Prototype cA = pA.Clone() as ConcretePrototypeA ;
Console.WriteLine("Cloned:"+cA.Id);
ConcretePrototypeB pB = new ConcretePrototypeB("B");
ConcretePrototypeB cB = (ConcretePrototypeB)pB.Clone();
Console.WriteLine("Cloned:"+cB.Id);
Console.ReadKey();
}
3、實例運行結果
四.原型模式實例分析(Example)1、場景
顏色索引器存儲多種顏色值,從顏色索引器中克隆客戶需要幾種顏色。結構如下圖所示
ColorManager類:顏色索引器
ColorPrototype類:原型模式抽象類
Color類:原型模式抽象類的具體實現,Clone方法的實現,克隆自身的操作
2、代碼
1、原型模式抽象類ColorPrototype及其具體實現類Color
/// <summary>
/// 原型模式抽象類
/// </summary>
public abstract class ColorPrototype
{
public abstract ColorPrototype Clone();
}
/// <summary>
/// 具體實現類
/// </summary>
public class Color : ColorPrototype
{
private int _red;
private int _green;
private int _blue;
public Color(int red, int green, int blue)
{
this._red = red;
this._green = green;
this._blue = blue;
}
/// <summary>
/// 實現淺復制
/// </summary>
/// <returns></returns>
public override ColorPrototype Clone()
{
Console.WriteLine("Cloning color RGB: {0,3},{1,3},{2,3}", _red, _green, _blue);
return this.MemberwiseClone() as ColorPrototype;
}
}
3、客戶端代碼
static void Main(string[] args)
{
ColorManager colormanager = new ColorManager();
//初始化標准的red green blue顏色。
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);
// 克隆顏色
Color color1 = colormanager["red"].Clone() as Color;
Color color2 = colormanager["peace"].Clone() as Color;
Color color3 = colormanager["flame"].Clone() as Color;
Console.ReadKey();
}
3、實例運行結果
五、總結(Summary)
本文對原型模式(Prototype Pattern)的概念、設計結構圖、代碼、使用場景、深復制與淺復制的區別,以及如何Net平台下實現克隆進行了描述。以一個實例進行了說明。原型模式是比較常用和簡單的設計模式。
出處:http://www.cnblogs.com/ywqu