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

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

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

軟件下載 | 游戲 | 討論 | 電視計算器

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

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

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

新手 | 你問我答 | 免費刷機救磚 | ROM固件

查看: 13968|回復: 0
上一主題 下一主題
[交流&討論]

也談一下“享元模式”

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

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

本版積分規(guī)則

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

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

GMT+8, 2025-1-29 02:29 , Processed in 0.065626 second(s), 15 queries , Redis On.

Powered by Discuz!

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

© 2007-2025 ZNDS.Com

快速回復 返回頂部 返回列表