• <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>

            那誰的技術(shù)博客

            感興趣領(lǐng)域:高性能服務(wù)器編程,存儲,算法,Linux內(nèi)核
            隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
            數(shù)據(jù)加載中……

            常見設(shè)計模式的解析和實現(xiàn)(C++)之十三-FlyWeight模式

            作用:
            運用共享技術(shù)有效地支持大量細(xì)粒度的對象。

            UML結(jié)構(gòu)圖:



            解析:
            Flyweight模式在大量使用一些可以被共享的對象的時候經(jīng)常使用.比如,在QQ聊天的時候很多時候你懶得回復(fù)又不得不回復(fù)的時候,一般會用一些客套的話語敷衍別人,如"呵呵","好的"等等之類的,這些簡單的答復(fù)其實每個人都是提前定義好的,在使用的時候才調(diào)用出來.Flyweight就是基于解決這種問題的思路而產(chǎn)生的,當(dāng)需要一個可以在其它地方共享使用的對象的時候,先去查詢是否已經(jīng)存在了同樣的對象,如果沒有就生成之有的話就直接使用.因此,Flyweight模式和Factory模式也經(jīng)常混用.

            實現(xiàn):
            需要說明的是下面的實現(xiàn)僅僅實現(xiàn)了對可共享對象的使用,非可共享對象的使用沒有列出,因為這個不是Flyweight模式的重點.這里的實現(xiàn)要點是采用一個list鏈表來保存這些可以被共享的對象,需要使用的時候就到鏈表中查詢是不是已經(jīng)存在了,如果不存在就初始化一個,然后返回這個對象的指針.

            1)Flyweight.h
            /********************************************************************
            ????created:????2006/07/26
            ????filename:?????FlyWeight.h
            ????author:????????李創(chuàng)
            ????????????????
            http://www.shnenglu.com/converse/

            ????purpose:????FlyWeight模式的演示代碼
            ********************************************************************
            */


            #ifndef?FLYWEIGHT_H
            #define?FLYWEIGHT_H

            #include?
            <string>
            #include?
            <list>

            typedef?std::
            string?STATE;

            class?Flyweight
            {
            public:
            ????
            virtual?~Flyweight(){}

            ????STATE?GetIntrinsicState();
            ????
            virtual?void?Operation(STATE&?ExtrinsicState)?=?0;

            protected:
            ????Flyweight(
            const?STATE&?state)?
            ????????:m_State(state)
            ????
            {
            ????}


            private:
            ????STATE?m_State;
            }
            ;

            class?FlyweightFactory
            {
            public:
            ????FlyweightFactory()
            {}
            ????
            ~FlyweightFactory();

            ????Flyweight
            *?GetFlyweight(const?STATE&?key);

            private:
            ????std::list
            <Flyweight*>????m_listFlyweight;
            }
            ;

            class?ConcreateFlyweight
            ????:?
            public?Flyweight
            {
            public:
            ????ConcreateFlyweight(
            const?STATE&?state)
            ????????:?Flyweight(state)
            ????
            {
            ????}

            ????
            virtual?~ConcreateFlyweight(){}

            ????
            virtual?void?Operation(STATE&?ExtrinsicState);
            }
            ;

            #endif

            2)Flyweight.cpp
            /********************************************************************
            ????created:????2006/07/26
            ????filename:?????FlyWeight.cpp
            ????author:????????李創(chuàng)
            ????????????????
            http://www.shnenglu.com/converse/

            ????purpose:????FlyWeight模式的演示代碼
            ********************************************************************
            */


            #include?
            "FlyWeight.h"
            #include?
            <iostream>

            inline?STATE?Flyweight::GetIntrinsicState()
            {
            ????
            return?m_State;
            }


            FlyweightFactory::
            ~FlyweightFactory()
            {
            ????std::list
            <Flyweight*>::iterator?iter1,?iter2,?temp;

            ????
            for?(iter1?=?m_listFlyweight.begin(),?iter2?=?m_listFlyweight.end();
            ????????iter1?
            !=?iter2;
            ????????)
            ????
            {
            ????????temp?
            =?iter1;
            ????????
            ++iter1;
            ????????delete?(
            *temp);
            ????}


            ????m_listFlyweight.clear();
            }


            Flyweight
            *?FlyweightFactory::GetFlyweight(const?STATE&?key)
            {
            ????std::list
            <Flyweight*>::iterator?iter1,?iter2;

            ????
            for?(iter1?=?m_listFlyweight.begin(),?iter2?=?m_listFlyweight.end();
            ?????????iter1?
            !=?iter2;
            ?????????
            ++iter1)
            ????
            {
            ????????
            if?((*iter1)->GetIntrinsicState()?==?key)
            ????????
            {
            ????????????std::cout?
            <<?"The?Flyweight:"?<<?key?<<?"?already?exits"<<?std::endl;
            ????????????
            return?(*iter1);
            ????????}

            ????}


            ????std::cout?
            <<?"Creating?a?new?Flyweight:"?<<?key?<<?std::endl;
            ????Flyweight
            *?flyweight?=?new?ConcreateFlyweight(key);
            ????m_listFlyweight.push_back(flyweight);
            }


            void?ConcreateFlyweight::Operation(STATE&?ExtrinsicState)
            {

            }


            3)Main.cpp
            /********************************************************************
            ????created:????2006/07/26
            ????filename:?????Main.cpp
            ????author:????????李創(chuàng)
            ????????????????
            http://www.shnenglu.com/converse/

            ????purpose:????FlyWeight模式的測試代碼
            ********************************************************************
            */


            #include?
            "FlyWeight.h"

            int?main()
            {
            ????FlyweightFactory?flyweightfactory;
            ????flyweightfactory.GetFlyweight(
            "hello");
            ????flyweightfactory.GetFlyweight(
            "world");
            ????flyweightfactory.GetFlyweight(
            "hello");

            ????system(
            "pause");
            ????
            return?0;
            }

            posted on 2006-08-03 21:12 那誰 閱讀(2352) 評論(0)  編輯 收藏 引用 所屬分類: 設(shè)計模式

            日本精品久久久中文字幕| 一级做a爰片久久毛片人呢| 91久久福利国产成人精品| 久久成人影院精品777| 国产精品99久久久久久董美香| 久久国产精品一区| 久久久久亚洲AV无码专区首JN| 国内精品人妻无码久久久影院| 99久久精品无码一区二区毛片| 日本五月天婷久久网站| 97久久精品无码一区二区天美 | 99久久99久久精品国产片果冻| 国产午夜福利精品久久2021| 久久精品18| avtt天堂网久久精品| 日韩人妻无码一区二区三区久久99| 国产精品久久永久免费| 久久亚洲熟女cc98cm| 久久国产V一级毛多内射| 久久精品国产亚洲AV无码麻豆| 久久婷婷五月综合97色直播| 成人久久久观看免费毛片 | 国产成人精品白浆久久69| 亚洲天堂久久久| 久久93精品国产91久久综合| AV无码久久久久不卡蜜桃| 色欲久久久天天天综合网| 亚洲国产成人久久综合碰| 大蕉久久伊人中文字幕| 久久精品亚洲一区二区三区浴池 | 久久精品aⅴ无码中文字字幕重口| 亚洲精品乱码久久久久久不卡| 久久亚洲精品中文字幕三区| 久久99精品久久久久久久不卡| 久久久久波多野结衣高潮| 久久人人爽人人爽人人片AV麻烦| 久久久久99精品成人片| 亚洲国产成人久久精品99| 亚洲午夜精品久久久久久app| 色综合久久综合网观看| 精品久久人人妻人人做精品 |