• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            C++ Programmer's Cookbook

            {C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

            模式設計c#--結構型--flyweight

            名稱 Flyweight
            結構 o_flyweight.bmp
            意圖 運用共享技術有效地支持大量細粒度的對象。
            適用性
            • 一個應用程序使用了大量的對象。
            • 完全由于使用大量的對象,造成很大的存儲開銷。
            • 對象的大多數狀態都可變為外部狀態。
            • 如果刪除對象的外部狀態,那么可以用相對較少的共享對象取代很多組對象。
            • 應用程序不依賴于對象標識。由于F l y w e i g h t 對象可以被共享,對于概念上明顯有別的對象,標識測試將返回真值。
            Code Example
            將內部狀態(不會發生變化的狀態)與外部狀態(可能發生變化的狀態)分離,這樣不會發生變化的部分可以抽取出來共享,而可能發生變化的部分由客戶維護。
            //?Flyweight?pattern?--?Structural?example??


            using?System;
            using?System.Collections;

            namespace?DoFactory.GangOfFour.Flyweight.Structural
            {
            ??
            //?MainApp?test?application?

            ??
            class?MainApp
            ??
            {
            ????
            static?void?Main()
            ????
            {
            ??????
            //?Arbitrary?extrinsic?state?
            ??????int?extrinsicstate?=?22;
            ????
            ??????FlyweightFactory?f?
            =?new?FlyweightFactory();

            ??????
            //?Work?with?different?flyweight?instances?
            ??????Flyweight?fx?=?f.GetFlyweight("X");
            ??????fx.Operation(
            --extrinsicstate);

            ??????Flyweight?fy?
            =?f.GetFlyweight("Y");
            ??????fy.Operation(
            --extrinsicstate);

            ??????Flyweight?fz?
            =?f.GetFlyweight("Z");
            ??????fz.Operation(
            --extrinsicstate);

            ??????UnsharedConcreteFlyweight?fu?
            =?new?
            ????????UnsharedConcreteFlyweight();

            ??????fu.Operation(
            --extrinsicstate);

            ??????
            //?Wait?for?user?
            ??????Console.Read();
            ????}

            ??}


            ??
            //?"FlyweightFactory"?

            ??
            class?FlyweightFactory?
            ??
            {
            ????
            private?Hashtable?flyweights?=?new?Hashtable();

            ????
            //?Constructor?
            ????public?FlyweightFactory()
            ????
            {
            ??????flyweights.Add(
            "X",?new?ConcreteFlyweight());????
            ??????flyweights.Add(
            "Y",?new?ConcreteFlyweight());
            ??????flyweights.Add(
            "Z",?new?ConcreteFlyweight());
            ????}


            ????
            public?Flyweight?GetFlyweight(string?key)
            ????
            {
            ??????
            return((Flyweight)flyweights[key]);?
            ????}

            ??}


            ??
            //?"Flyweight"?

            ??
            abstract?class?Flyweight?
            ??
            {
            ????
            public?abstract?void?Operation(int?extrinsicstate);
            ??}


            ??
            //?"ConcreteFlyweight"?

            ??
            class?ConcreteFlyweight?:?Flyweight
            ??
            {
            ????
            public?override?void?Operation(int?extrinsicstate)
            ????
            {
            ??????Console.WriteLine(
            "ConcreteFlyweight:?"?+?extrinsicstate);
            ????}

            ??}


            ??
            //?"UnsharedConcreteFlyweight"?

            ??
            class?UnsharedConcreteFlyweight?:?Flyweight
            ??
            {
            ????
            public?override?void?Operation(int?extrinsicstate)
            ????
            {
            ??????Console.WriteLine(
            "UnsharedConcreteFlyweight:?"?+?
            ????????extrinsicstate);
            ????}

            ??}

            }

            ?


            享元模式應當在什么情況下使用

            當以下所有的條件都滿足時,可以考慮使用享元模式:

            • 一個系統有大量的對象。
            • 這些對象耗費大量的內存。
            • 這些對象的狀態中的大部分都可以外部化。
            • 這些對象可以按照內蘊狀態分成很多的組,當把外蘊對象從對象中剔除時,每一個組都可以僅用一個對象代替。
            • 軟件系統不依賴于這些對象的身份,換言之,這些對象可以是不可分辨的。

            滿足以上的這些條件的系統可以使用享元對象。

            最后,使用享元模式需要維護一個記錄了系統已有的所有享元的表,而這需要耗費資源。因此,應當在有足夠多的享元實例可供共享時才值得使用享元模式。


            八、?享元模式的優點和缺點

            享元模式的優點在于它大幅度地降低內存中對象的數量。但是,它做到這一點所付出的代價也是很高的:

            • 享元模式使得系統更加復雜。為了使對象可以共享,需要將一些狀態外部化,這使得程序的邏輯復雜化。
            • 享元模式將享元對象的狀態外部化,而讀取外部狀態使得運行時間稍微變長。

            享元模式的應用

            享元模式在編輯器系統中大量使用。一個文本編輯器往往會提供很多種字體,而通常的做法就是將每一個字母做成一個享元對象。享元對象的內蘊狀態就是這個字母,而字母在文本中的位置和字模風格等其他信息則是外蘊狀態。比如,字母a可能出現在文本的很多地方,雖然這些字母a的位置和字模風格不同,但是所有這些地方使用的都是同一個字母對象。這樣一來,字母對象就可以在整個系統中共享。

            //?Flyweight?pattern?--?Real?World?example??


            using?System;
            using?System.Collections;

            namespace?DoFactory.GangOfFour.Flyweight.RealWorld
            {

            ??
            //?MainApp?test?application?

            ??
            class?MainApp
            ??
            {
            ????
            static?void?Main()
            ????
            {
            ??????
            //?Build?a?document?with?text?
            ??????string?document?=?"AAZZBBZB";
            ??????
            char[]?chars?=?document.ToCharArray();

            ??????CharacterFactory?f?
            =?new?CharacterFactory();

            ??????
            //?extrinsic?state?
            ??????int?pointSize?=?10;

            ??????
            //?For?each?character?use?a?flyweight?object?
            ??????foreach?(char?c?in?chars)
            ??????
            {
            ????????pointSize
            ++;
            ????????Character?character?
            =?f.GetCharacter(c);
            ????????character.Display(pointSize);
            ??????}


            ??????
            //?Wait?for?user?
            ??????Console.Read();
            ????}

            ??}


            ??
            //?"FlyweightFactory"?

            ??
            class?CharacterFactory
            ??
            {
            ????
            private?Hashtable?characters?=?new?Hashtable();

            ????
            public?Character?GetCharacter(char?key)
            ????
            {
            ??????
            //?Uses?"lazy?initialization"?
            ??????Character?character?=?characters[key]?as?Character;
            ??????
            if?(character?==?null)
            ??????
            {
            ????????
            switch?(key)
            ????????
            {
            ??????????
            case?'A':?character?=?new?CharacterA();?break;
            ??????????
            case?'B':?character?=?new?CharacterB();?break;
            ????????????
            //?
            ??????????case?'Z':?character?=?new?CharacterZ();?break;
            ????????}

            ????????characters.Add(key,?character);
            ??????}

            ??????
            return?character;
            ????}

            ??}


            ??
            //?"Flyweight"?

            ??
            abstract?class?Character
            ??
            {
            ????
            protected?char?symbol;
            ????
            protected?int?width;
            ????
            protected?int?height;
            ????
            protected?int?ascent;
            ????
            protected?int?descent;
            ????
            protected?int?pointSize;

            ????
            public?abstract?void?Display(int?pointSize);
            ??}


            ??
            //?"ConcreteFlyweight"?

            ??
            class?CharacterA?:?Character
            ??
            {
            ????
            //?Constructor?
            ????public?CharacterA()
            ????
            {
            ??????
            this.symbol?=?'A';
            ??????
            this.height?=?100;
            ??????
            this.width?=?120;
            ??????
            this.ascent?=?70;
            ??????
            this.descent?=?0;
            ????}


            ????
            public?override?void?Display(int?pointSize)
            ????
            {
            ??????
            this.pointSize?=?pointSize;
            ??????Console.WriteLine(
            this.symbol?+?
            ????????
            "?(pointsize?"?+?this.pointSize?+?")");
            ????}

            ??}


            ??
            //?"ConcreteFlyweight"?

            ??
            class?CharacterB?:?Character
            ??
            {
            ????
            //?Constructor?
            ????public?CharacterB()
            ????
            {
            ??????
            this.symbol?=?'B';
            ??????
            this.height?=?100;
            ??????
            this.width?=?140;
            ??????
            this.ascent?=?72;
            ??????
            this.descent?=?0;
            ????}


            ????
            public?override?void?Display(int?pointSize)
            ????
            {
            ??????
            this.pointSize?=?pointSize;
            ??????Console.WriteLine(
            this.symbol?+?
            ????????
            "?(pointsize?"?+?this.pointSize?+?")");
            ????}


            ??}


            ??
            //??C,?D,?E,?etc.?

            ??
            //?"ConcreteFlyweight"?

            ??
            class?CharacterZ?:?Character
            ??
            {
            ????
            //?Constructor?
            ????public?CharacterZ()
            ????
            {
            ??????
            this.symbol?=?'Z';
            ??????
            this.height?=?100;
            ??????
            this.width?=?100;
            ??????
            this.ascent?=?68;
            ??????
            this.descent?=?0;
            ????}


            ????
            public?override?void?Display(int?pointSize)
            ????
            {
            ??????
            this.pointSize?=?pointSize;
            ??????Console.WriteLine(
            this.symbol?+?
            ????????
            "?(pointsize?"?+?this.pointSize?+?")");
            ????}

            ??}

            }

            ?

            Output
            A (pointsize 11)
            A (pointsize 12)
            Z (pointsize 13)
            Z (pointsize 14)
            B (pointsize 15)
            B (pointsize 16)
            Z (pointsize 17)
            B (pointsize 18)

            posted on 2006-01-03 15:50 夢在天涯 閱讀(722) 評論(0)  編輯 收藏 引用 所屬分類: Design pattern

            公告

            EMail:itech001#126.com

            導航

            統計

            • 隨筆 - 461
            • 文章 - 4
            • 評論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1804159
            • 排名 - 5

            最新評論

            閱讀排行榜

            久久久青草久久久青草| 色婷婷综合久久久久中文字幕| 久久97久久97精品免视看| 精品久久久久久国产| 99久久超碰中文字幕伊人| 久久久久高潮综合影院| 久久伊人精品一区二区三区| 中文精品99久久国产| 久久久久久伊人高潮影院| 亚洲va国产va天堂va久久| 亚洲AV日韩精品久久久久| 久久久久亚洲AV无码网站| 国产人久久人人人人爽| 久久久久久免费一区二区三区| 91精品国产91久久久久久| 久久本道久久综合伊人| 欧美与黑人午夜性猛交久久久 | 91精品国产高清久久久久久91 | 亚洲国产视频久久| 久久青青色综合| 久久精品毛片免费观看| 精品午夜久久福利大片| 久久人人超碰精品CAOPOREN| 久久综合亚洲鲁鲁五月天| 99re久久精品国产首页2020| 亚洲狠狠综合久久| 久久综合亚洲色一区二区三区| 久久久久无码精品国产| 久久久精品波多野结衣| 亚洲精品白浆高清久久久久久 | 久久久久国产视频电影| 精品久久久无码人妻中文字幕| 精品久久久久久综合日本| 麻豆久久| 久久91综合国产91久久精品| 亚洲精品第一综合99久久| 国产精品久久久久久| 欧美伊人久久大香线蕉综合| 久久久久中文字幕| 久久久久女人精品毛片| 久久国内免费视频|