1. 程式人生 > >享元模式

享元模式

不存在 ati pan 例如 管理 而是 設計 pri 技術

享元模式:運用共享技術有效地支持大量細粒度的對象。

    /// <summary>
    ///  抽象享元類,提供具體享元類具有的方法
    /// </summary>
    public abstract class Flyweight
    {
        public abstract void Operation(int extrinsicstate);
    }

    // 具體的享元對象,這樣我們不把每個字母設計成一個單獨的類了,而是作為把共享的字母作為享元對象的內部狀態
    public class ConcreteFlyweight : Flyweight
    {
        
// 內部狀態 private string intrinsicstate ; // 構造函數 public ConcreteFlyweight(string innerState) { this.intrinsicstate = innerState; } /// <summary> /// 享元類的實例方法 /// </summary> /// <param name="extrinsicstate">外部狀態</param>
public override void Operation(int extrinsicstate) { Console.WriteLine("具體實現類: intrinsicstate {0}, extrinsicstate {1}", intrinsicstate, extrinsicstate); } } /// <summary> /// 享元工廠,負責創建和管理享元對象 /// </summary> public class FlyweightFactory {
// 最好使用泛型Dictionary<string,Flyweighy> //public Dictionary<string, Flyweight> flyweights = new Dictionary<string, Flyweight>(); public Hashtable flyweights = new Hashtable(); public FlyweightFactory() { flyweights.Add("A", new ConcreteFlyweight("A")); flyweights.Add("B", new ConcreteFlyweight("B")); flyweights.Add("C", new ConcreteFlyweight("C")); } public Flyweight GetFlyweight(string key) { // 更好的實現如下 //Flyweight flyweight = flyweights[key] as Flyweight; //if (flyweight == null) //{ // Console.WriteLine("駐留池中不存在字符串" + key); // flyweight = new ConcreteFlyweight(key); //} //return flyweight; return flyweights[key] as Flyweight; } } /// <summary> /// 客戶端調用 /// </summary> class Client { static void Main(string[] args) { // 定義外部狀態,例如字母的位置等信息 int externalstate = 10; // 初始化享元工廠 FlyweightFactory factory = new FlyweightFactory(); // 判斷是否已經創建了字母A,如果已經創建就直接使用創建的對象A Flyweight fa = factory.GetFlyweight("A"); if (fa != null) { // 把外部狀態作為享元對象的方法調用參數 fa.Operation(--externalstate); } // 判斷是否已經創建了字母B Flyweight fb = factory.GetFlyweight("B"); if (fb != null) { fb.Operation(--externalstate); } // 判斷是否已經創建了字母C Flyweight fc = factory.GetFlyweight("C"); if (fc != null) { fc.Operation(--externalstate); } // 判斷是否已經創建了字母D Flyweight fd= factory.GetFlyweight("D"); if (fd != null) { fd.Operation(--externalstate); } else { Console.WriteLine("駐留池中不存在字符串D"); // 這時候就需要創建一個對象並放入駐留池中 ConcreteFlyweight d = new ConcreteFlyweight("D"); factory.flyweights.Add("D", d); } Console.Read(); } }

代碼參考:http://www.cnblogs.com/zhili/p/FlyweightPattern.html

享元模式