日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

設計模式學習筆記(十二)——Flyweight享元模式

 skywood 2007-08-06

   Flyweight享元設計模式是一種結構型設計模式,它主要解決的問題是:由于(同類)對象的數(shù)量太大,采用面向對象時給系統(tǒng)帶來了難以承受的內存開銷。比如有這樣一個場景:一個停車場中有1000輛汽車,我們所定義的汽車對象占用內存0.3M,那么要實例化1000輛就是300M。由此可見,在這種情況下采用一般的面向對象方式出現(xiàn)了大量細粒度的對象會很快充斥在系統(tǒng)中,從而帶來很高的運行是代價(這里指的代價是內存開銷的代價)。

       GoF《設計模式》中說道:運用共享技術有效的支持大量細粒度的對象。

       Flyweight模式的結構大概是這樣的:


      
(這張圖是按照我的理解畫出來的,如果有不對的地方還請幫我指正,謝謝),從圖上可以看出Flyweight模式是將相同的對象存為一個,就是在FlyweightFactory中對于實例化對象的判斷。這樣,客戶代碼即使是調用1000000個對象,如果這些對象的種類只有一個的話,對于內存的分配上也只是分配了一個對象的空間。但是有一點我想要注意:就是對于引用對象來說,這樣做,如果其中某一個對象發(fā)生變化,那么同類中的所有對象也會隨之變化。

       來看看程序,定義一個場景:有一個汽車類型,客戶程序要實例化1000個,實例化后查看一下內存分配情況。

       普通的面向對象方式:

       class Class1

    {

        [STAThread]

        static void Main(string[] args)

        {

            Console.WriteLine("實例化前:" + GC.GetTotalMemory(false));

            ArrayList list = new ArrayList(1000);

            for(int i = 0;i < 1000;i++)

            {

                Car car = new Car("4.2M","Wheel","NeedForSpeed","BMW","Black");

                list.Add(car);

            }

            Console.WriteLine("實例化后:" + GC.GetTotalMemory(false));

            Console.Read();

        }

    }

 

       public class Car

    {

        private string body;

        private string wheel;

        private string engine;

        private string brand;

        private string color;  

 

        public string Body

        {

            get{return body;}

            set{body = value;}

        }

 

        public string Wheel

        {

            get{return wheel;}

            set{wheel = value;}

        }

 

        public string Engine

        {

            get{return engine;}

            set{engine = value;}

        }

 

        public string Brand

        {

            get{return brand;}

            set{brand = value;}

        }

 

        public string Color

        {

            get{return color;}

            set{color = value;}

        }

 

        public Car(string body,string wheel,string engine,string brand,string color)

        {

            Body = body;

            Wheel = wheel;

            Engine = engine;

            Brand = brand;

            Color = color;

        }

    }

    內存分配情況如下:

實例化前:16384

實例化后:65536

       然后再用Flyweight模式方式程序做一下比較:

       class Class1

    {

        [STAThread]

        static void Main(string[] args)

        {

            Console.WriteLine("實例化前:" + GC.GetTotalMemory(false));

            ArrayList list = new ArrayList(1000);

            for(int i = 0;i < 1000;i++)

            {

                FlyWeightCar car = FlyWeightFactory.CreateInit("4.2M","Wheel","NeedForSpeed","BMW","Black");

                list.Add(car);

            }

            Console.WriteLine("實例化后:" + GC.GetTotalMemory(false));

            Console.Read();

        }

    }

 

public class FlyWeightFactory

    {

        private static FlyWeightCar car;

        private static Hashtable table = new Hashtable();

        public static FlyWeightCar CreateInit(string body,string wheel,string engine,string brand,string color)

        {

            if(table[brand] != null)

            {

                car = (FlyWeightCar)table[brand];

            }

            else

            {

                car = new FlyWeightCar();

                car.Brand = brand;

                car.CarBody = new CarBody(body,wheel,engine,color);

                table.Add(brand,car);

            }

            return car;

        }

    }

 

    public class FlyWeightCar

    {

        private string brand;

 

        public string Brand

        {

            get

            {

                return brand;

            }

            set

            {

                brand = value;

            }

        }

 

        private CarBody carbody;

 

        public CarBody CarBody

        {

            get

            {

                return carbody;

            }

            set

            {

                this.carbody = value;

            }

        }

    }

 

    public class CarBody

    {

        private string body;

        private string wheel;

        private string engine;

        private string color;  

 

        public string Body

        {

            get{return body;}

            set{body = value;}

        }

 

        public string Wheel

        {

            get{return wheel;}

            set{wheel = value;}

        }

 

        public string Engine

        {

            get{return engine;}

            set{engine = value;}

        }

 

        public string Color

        {

            get{return color;}

            set{color = value;}

        }

 

        public CarBody(string body,string wheel,string engine,string color)

        {

            Body = body;

            Wheel = wheel;

            Engine = engine;

            Color = color;

        }

    }

    內存分配情況:

實例化前:16384

實例化后:40960

       從數(shù)字上不難看出內存分配的容量節(jié)省了不少,而且隨著數(shù)量的增加,差距會更大,當然我也測試了一下數(shù)量減少的情況,當我實例化100個對象是結果是普通方式的內存分配更小一些,所以,在使用時,我們一定要對所實例化對象的個數(shù)進行評估,否則的話會適得其反。

       Flyweight模式的幾個要點:

       1、面向對象很好的解決了抽象性的問題,但是作為一個運行在機器中的程序實體,我們需要考慮對象的代價問題。Flyweight設計模式主要解決面向對象的代價問題,一般不觸及面向對象的抽象性問題。

2Flyweight采用對象共享的做法來降低系統(tǒng)中對象的個數(shù),從而降低細粒度對象給系統(tǒng)帶來的內存壓力。在具體實現(xiàn)方面,要注意對象的狀態(tài)處理。

3、對象的數(shù)量太大從而導致對象內存開銷加大(這個數(shù)量要經(jīng)過評估,而不能憑空臆斷)

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多