首頁 收藏 QQ群
 網(wǎng)站導(dǎo)航

ZNDS智能電視網(wǎng) 推薦當(dāng)貝市場

TV應(yīng)用下載 / 資源分享區(qū)

軟件下載 | 游戲 | 討論 | 電視計(jì)算器

綜合交流 / 評測 / 活動區(qū)

交流區(qū) | 測硬件 | 網(wǎng)站活動 | Z幣中心

新手入門 / 進(jìn)階 / 社區(qū)互助

新手 | 你問我答 | 免費(fèi)刷機(jī)救磚 | ROM固件

查看: 13738|回復(fù): 0
上一主題 下一主題
[交流&討論]

也談一下“享元模式”

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-8-28 16:29 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
2本篇我們將會講述結(jié)構(gòu)性模式中的另外一個(gè)非常有用的模式-享元模式,享元模式的特點(diǎn)是,復(fù)用我們內(nèi)存中已存在的對象,降低系統(tǒng)創(chuàng)建對象實(shí)例的性能消耗。在.NET下的值類型和引用類型的內(nèi)存分配機(jī)制,我這里就不做詳細(xì)的講解了,包括引用類型與值類型之間的裝箱和拆箱的操作,這個(gè)具體   
的可以參考園子里面的關(guān)于這方面的文章的討論。   
    我們來給出個(gè)簡單的享元模式的應(yīng)用前后的對比圖,大概我們就知道享元模式的重要作用了。   
    我們這里以繪制一個(gè)有樣式的字體來說明吧,有的時(shí)候我們想繪制一個(gè)純色的文字,比如紅色,那么我們可能需要創(chuàng)建很多的實(shí)例,通常來說,這些   
實(shí)例的差別不大,這個(gè)時(shí)候,我們可以考慮復(fù)用其中創(chuàng)建的某個(gè)實(shí)例,而不用去new這么多相同的對象,來完成這樣的工作。我們下面以這個(gè)例子來說   
明,使用享元模式的前后對比的情況。   
    使用享元模式前:   
          
    使用享元模式后:   
          
    通過上圖我們可以大概的看出享元模式的目的是什么,本篇將會從以下幾點(diǎn)出發(fā),講述享元模式的應(yīng)用。   
    1、享元模式的特點(diǎn)和場景。   
    2、享元模式的經(jīng)典實(shí)現(xiàn)。   
    3、享元模式的其他方案。   
    4、享元模式小結(jié)。   
下面我們來看下享元模式的類圖吧:   
     
       a、上篇回顧。   
       b、摘要。   
       c、本文大綱。   
       d、享元模式的特點(diǎn)及使用場景。   
       e、享元模式的經(jīng)典實(shí)現(xiàn)。   
       f、享元模式的其他方案。   
       g、享元模式使用總結(jié)。   
       h、系列進(jìn)度。   
       i、下篇預(yù)告。   
      享元模式的意圖是通過共享有效支持大量細(xì)粒度的對象,來提供應(yīng)用程序的性能,節(jié)省系統(tǒng)中重復(fù)創(chuàng)建對象實(shí)例的性能消耗,這個(gè)怎么理解呢?其實(shí)就是以下幾點(diǎn)的含義:   
1、當(dāng)我們系統(tǒng)中某個(gè)對象類型的實(shí)例較多的情況。   
2、并且要求這些實(shí)例進(jìn)行分類后,發(fā)現(xiàn)真正有區(qū)別的分類很少的情況。   
      例如我們的生活中很多的場景,我們在使用拼音輸入的法的時(shí)候,如果說我們每個(gè)字都是new一個(gè)對象實(shí)例的操作的話,那么內(nèi)存中的實(shí)例就太可   
怕,這個(gè)時(shí)候,我們是不是可以考慮將這些重復(fù)的字體在內(nèi)存中只是創(chuàng)建一次,而是通過復(fù)用對象的形式,來組織一些可能有多個(gè)字符重復(fù)的內(nèi)容呢?   
也許這是一個(gè)不錯(cuò)的主意,我們來看看這個(gè)示例的過程吧。   
      
         1、當(dāng)我們發(fā)現(xiàn)某個(gè)類型的對象有大量的實(shí)例時(shí),我們是否可以對這些實(shí)例進(jìn)行分類,經(jīng)過分類后,我們發(fā)現(xiàn)只有很少的類別的情況下。   
         2、我們發(fā)現(xiàn)通過使用享元模式后能夠提高系統(tǒng)的性能和不會帶來更多的復(fù)雜度時(shí)。   
      享元模式一般是給出本地內(nèi)存資源節(jié)省的一個(gè)方案,并不適合互聯(lián)網(wǎng)上的分布式應(yīng)用的情況,不過享元模式對于排他性的要求資源的控制,是個(gè)不   
錯(cuò)的選擇的。   
      我們下面來根據(jù)上面的我們對輸入法中的字體來進(jìn)行分析,給出相關(guān)的示例代碼:   
      字體類型的基類:   
    public class FontBase   
    {   
        private List<string> font = new List<string>();   
        private string fontName;   
        public FontBase(string name)   
        {   
            this.fontName = name;   
        }   
        public FontBase AddFont(string font)   
        {   
            this.font.Add(font);   
            return this;   
        }   
        public virtual string FontName   
        {   
            get   
            {   
                return this.fontName;   
            }   
        }   
    }   
    具體的文字類型類:   
    public class ChineseFont : FontBase   
    {   
        public ChineseFont()   
            : base("ChineseFont")   
        {   
            base.AddFont("ChineseFont");   
        }   
    }   
    public class EnglishFont : FontBase   
    {   
        public EnglishFont()   
            : base("EnglishFont")   
        {   
            base.AddFont("EnglishFont");   
        }   
    }   
具體的創(chuàng)建工廠類:   
    public class FontFactory   
    {   
        private  Dictionary<string, FontBase> fonts = new Dictionary<string, FontBase>();   
        public  FontBase Create(string name)   
        {   
            FontBase fontBase = fonts[name];   
            if (fontBase != null)   
                return fontBase;   
            fontBase = (FontBase)Activator.CreateInstance(Type.GetType(name));   
            return fontBase;   
        }   
    }   
通過上面實(shí)例的講解我們知道,我們通過緩存對象類型的形式來控制對象實(shí)例的創(chuàng)建過程,經(jīng)典的模式中沒有體現(xiàn)共享的狀態(tài),比如說我們在外部可能對于   
享元對象來說是不共享的,內(nèi)部是共享的。下面我們來看看享元模式的變種吧。   
            對于上面的經(jīng)典方案帶來的問題,可能我們需要更好的考慮,我們?nèi)绾螒?yīng)對多種對象類型,我們?nèi)绾喂芾聿⒐蚕磉@些對象實(shí)例,這些都是我們需要考慮的問   
題,經(jīng)過上面的思考,我們這里可以參考我們平時(shí)開發(fā)的ORM中的連接池的思路,我們這里對享元模式提供-對象池的技術(shù)。   
            我們在配置文件中控制對象池中的某個(gè)類型對象實(shí)例的數(shù)量,對象的生命周期的時(shí)間,默認(rèn)初始化多少個(gè)對象實(shí)例,以提前準(zhǔn)備,為后續(xù)的使用提供服務(wù)。   
            我們這里可以設(shè)計(jì)出這個(gè)專門的對象池,我們可以提供如下的功能:   
            1、根據(jù)對象類型動態(tài)的創(chuàng)建對象實(shí)例。   
            2、根據(jù)對象池中的配置,在對象池中找到空閑的實(shí)體提供給程序調(diào)用,減少創(chuàng)建對象的次數(shù)。   
            3、我們需要設(shè)計(jì)每個(gè)類型的緩沖池,通過把對象進(jìn)行緩存,提供性能。如果對象池中的對象長期不會調(diào)用,那么我們會提供一個(gè)銷毀對象的機(jī)制。   
我們來看看對象池的設(shè)計(jì)結(jié)構(gòu)吧:   
      
通過上面的幾個(gè)組件,來協(xié)調(diào)完成對象池的工作。   
這里給出相關(guān)的示例代碼:   
我們先給出配置文件配置緩沖池的配置信息:   
   
?   
1   
2   
3   
4   
5   
6   
7   
8   
9   
10   
11   
12   
13   
14   
15   
16   
17   

上一篇:android防止反編譯的措施
下一篇:Java之implements
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

Archiver|新帖|標(biāo)簽|軟件|Sitemap|ZNDS智能電視網(wǎng) ( 蘇ICP備2023012627號 )

網(wǎng)絡(luò)信息服務(wù)信用承諾書 | 增值電信業(yè)務(wù)經(jīng)營許可證:蘇B2-20221768 丨 蘇公網(wǎng)安備 32011402011373號

GMT+8, 2025-1-7 09:11 , Processed in 0.060291 second(s), 15 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報(bào):report#znds.com (請將#替換為@)

© 2007-2024 ZNDS.Com

快速回復(fù) 返回頂部 返回列表