程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .Net設計模式實例之原型模式( Prototype Pattern)

.Net設計模式實例之原型模式( Prototype Pattern)

編輯:關於.NET

一、原型模式簡介(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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved