天天看點

一天一個設計模式之享元模式(flyweight)

設計模式,這個東西一直都有耳聞,也曾經研究過一段時間,不過早已經忘記了,現在打算重新撿回來,是以在這裡放出我再次學習的心得體會。

Flyweight,俗稱 享元模式,曾經我好像在那本書上,翻譯成飛行模式,我狂汗,當是我對設計模式還處于剛知曉階段,為此害我對設計模式的一直懷有敬畏之心,破書真是誤認子弟啊。

廢話不多說,先說說我對飛行模式的了解,相信大家看過GOF之後或者自己查閱資料後對其不一定能說出他的精髓所在,在我看來,隻不過是一種節約記憶體的方式,換句話講就是

<b>對于同一個對象保證在記憶體中隻存儲一次,即,不要出現重複存儲同一個對象的程式設計方式</b>

這是我自己的見解,比較權威的說法就是:

<b>運用共享技術有效地支援大量細粒度的對象</b>

适用場合:

F l y w e i g h t模式的有效性很大程度上取決于如何使用它以及在何處使用它。當以下情況都成立時使用F l y w e i g h t模式:

• 一個應用程式使用了大量的對象。

• 完全由于使用大量的對象,造成很大的存儲開銷。

• 對象的大多數狀态都可變為外部狀态。

• 如果删除對象的外部狀态,那麼可以用相對較少的共享對象取代很多組對象。

• 應用程式不依賴于對象辨別。由于F l y w e i g h t對象可以被共享,對于概念上明顯有别的對

象,辨別測試将傳回真值。

<b>通俗的講,如果在一個場合需要多個重複的對象的時候,即可以使用享元模式以節約資源,提高程式運作效率。典型的例子就是線程池,和資料庫的連接配接池。</b>

<b></b>

<b>下面我将我的代碼放出:</b>

using System;

using System.Collections;

namespace GOF.Flyweight

{

        public abstract class Flyweight

        {

                protected string name;

        }

        public class ConcreteFlyweight    : Flyweight

                public ConcreteFlyweight(string name)

                {

                        this.name = name;

                }

                public override string ToString()

                        return this.name;

        public class FlyweightFactory

                Hashtable ht = new Hashtable();

                public FlyweightFactory()

                public    Flyweight getFlyWeight(string name)

                        Flyweight an = ht[name] as Flyweight;

                        if(an==null)

                        {

                                an = new ConcreteFlyweight(name);

                                ht.Add(name, an);

                        }

                        return an;

                public void GetSize()

                        Console.WriteLine("FlyweightFactory's Size is " + ht.Count);

        class Program

                static void Main(string[] args)

                        FlyweightFactory factory = new FlyweightFactory();

                         Flyweight fly1 = factory.getFlyWeight("Google");

                         Flyweight fly2 = factory.getFlyWeight("Baidu");

                         Flyweight fly3 = factory.getFlyWeight("Google");

                         Flyweight fly4 = factory.getFlyWeight("Baidu");

                         Flyweight fly5 = factory.getFlyWeight("Google");

                         Flyweight fly6 = factory.getFlyWeight("Google");

                         Console.WriteLine(fly1.ToString());

                         Console.WriteLine(fly2.ToString());

                         Console.WriteLine(fly3.ToString());

                         Console.WriteLine(fly4.ToString());

                         Console.WriteLine(fly5.ToString());

                         Console.WriteLine(fly6.ToString());

                         factory.GetSize();

}

輸出結果為:

Google

Baidu

FlyweightFactory's Size is 2

請按任意鍵繼續. . .

在這段代碼中最重要的一點是FlyWeightFactory中隊hashtable的應用,通過hashtable來確定目前對象傳回的是同一對象~,hashtable中有就傳回,沒有就新生成,并将其存入hashtable,這個是享元模式的代碼的關鍵點所在,其實,這個才是他的精髓,至于,具體應用中,我覺得不一定非得按照我寫的代碼來,靈活運用,隻要是確定自己的對象在記憶體中是唯一的即可~~

繼續閱讀