<ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>


      前言


      ?  今天我們繼續(xù)講述設(shè)計模式,今天提及的是享元模式,享——共享。之前不是出現(xiàn)了一系列共享的東西嗎?為啥呀,還不就是有些東西每個人都需要,但是每個人都去買一個又有點浪費。所以出現(xiàn)共享。話費一定的經(jīng)濟(jì)可以使用,使用完成之后又歸還。這就是享。分享共享。今天講的享元模式跟這相類似。享元模式——通俗來說也就是共享最小單元的一種模式。我們就一起看看到底啥是這享元模式吧。

      享元模式介紹

      一、來由


        在軟件系統(tǒng)開發(fā)中,我們肯定會出現(xiàn)重復(fù)使用同一個對象的情況,每次使用都new一個對象出來。這樣的話對于內(nèi)存來說就需要多次反復(fù)的申請內(nèi)存了。這樣使用內(nèi)存也就越來越多,這會出現(xiàn)大問題的。那么能不能創(chuàng)建new一個對象。然后使用的時候就共同使用一個就好了。這也就是享元模式的含義所在了——共享一個對象。

      二、?意圖

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

      三、?案例圖

      ?

      ?

      ?

      ?

      四、享元模式代碼示例

        ?看上面的案例圖我們可以發(fā)現(xiàn)享元模式主要包含以下部分:

      享元工廠角色:這個角色主要負(fù)責(zé)創(chuàng)建和管理享元角色。判斷是否存在符合要求的享元對象,如果存在則直接拿取,如果不存在的話就會創(chuàng)建一個享元對象并保存。

      抽象享元角色:這個角色是所有享元角色的基類。提供需要實現(xiàn)的公共接口

      具體享元角色:繼承于抽象享元角色。實現(xiàn)其抽象的接口。

      客戶端:負(fù)責(zé)調(diào)用并處理邏輯,且保存多有享元對象的狀態(tài)

        在我們平時使用的編輯器中,會出現(xiàn)很多的字,這些字也是會一直重復(fù)出現(xiàn)的。那么我們現(xiàn)在就試著使用享元模式來對這些字進(jìn)行處理。這里暫且使用字母代替:

      ?
      namespace Flyweight_Pattern { class FlyweightPattern { } #region 抽象享元角色——抽象公共接口
      public abstract class Flyweight { /// <summary> /// 表述輸出的位置 /// </summary> ///
      <param name="externalstate">外在的狀態(tài),隨著環(huán)境改變而改變</param> public abstract void
      OutInput(int externalstate); } #endregion #region 具體享元角色——實現(xiàn)其具體 public class
      SpecificFlyweight : Flyweight {private string Innerstate; /// <summary> ///
      內(nèi)部狀態(tài)接收/// </summary> /// <param name="innerstate">內(nèi)部狀態(tài)</param> public
      SpecificFlyweight(string innerstate) { this.Innerstate = innerstate; } ///
      <summary> /// 實現(xiàn)方法 /// </summary> /// <param name="externalstate">外部狀態(tài)</param>
      public override void OutInput(int externalstate) { Console.WriteLine($"
      內(nèi)部狀態(tài):{Innerstate}————外部狀態(tài):{externalstate}"); } } #endregion #region
      享元工廠角色——對享元角色進(jìn)行創(chuàng)建及管理的public class FlyweightFactory { public Dictionary<string,
      SpecificFlyweight> keyValuePairs =new Dictionary<string, SpecificFlyweight>();
      public SpecificFlyweight GetFlyweight(string Key) { SpecificFlyweight specific =
      null; if (!keyValuePairs.ContainsKey("A")) { Console.WriteLine("暫時未遇見該Key");
      keyValuePairs.Add(Key,new SpecificFlyweight(Key)); Console.WriteLine("現(xiàn)已保存該Key"
      ); }else { specific = keyValuePairs[Key] as SpecificFlyweight; } return
      specific; } }#endregion }
      ?
      namespace Flyweight_Pattern { class Program { static void Main(string[] args) {
      ///初始化享元工廠 FlyweightFactory factory = new FlyweightFactory(); while (true) {
      Console.WriteLine("請輸入字符的位置:"); var indexstring = Console.ReadLine(); if (int
      .TryParse(indexstring,out int index)) { Console.WriteLine("請輸入字符:"); string str
      = Console.ReadLine(); ///判斷字符是否創(chuàng)建 Flyweight flyweight =
      factory.GetFlyweight(str);//如果存在則輸出信息 if (flyweight != null) {
      flyweight.OutInput(index); } }else { Console.WriteLine("請輸入數(shù)字!"); }
      Console.WriteLine("結(jié)束請輸入N"); if (Console.ReadLine()=="N") { break; } }
      Console.WriteLine("已結(jié)束"); Console.ReadLine(); } } }
      ?

      使用場景及優(yōu)缺點

        這里我們需要注意的是劃分好外部狀態(tài)和內(nèi)部狀態(tài),否則混淆之后可能引起線程安全問題。同時必不可少的是一個工廠對象進(jìn)行控制。

      這里我們解釋下在享元模式中的內(nèi)在狀態(tài)和外在狀態(tài):

      內(nèi)在狀態(tài):不隨環(huán)境的變化而變化,上面例子中不管位置如何變化,A就是A。字母A就是內(nèi)在狀態(tài)。

      外在狀態(tài):會隨著環(huán)境的變化而變化,上面例子中位置變化所以輸出的位置也是不一致的。字母A的位置就是外在狀態(tài)

      一、?使用場景

        對于享元模式來說其使用場景可分以下四點:

      1、系統(tǒng)需要大量相似對象

      2、創(chuàng)建這些對象需要花費大量資源

      3、狀態(tài)可分為內(nèi)在狀態(tài)和外在狀態(tài),可以根據(jù)內(nèi)在狀態(tài)分為各種組。

      4、需要緩沖池的場景

      二、?優(yōu)點

      1、享元模式的優(yōu)點最主要的是極大的減少了系統(tǒng)中對象的創(chuàng)建,降低了內(nèi)存使用提高了效率

      三、?缺點

      任何東西來說都是有利有弊的,我們看下享元模式又存在哪些弊端呢

      1、為了使一些對象共享,對對象區(qū)分了內(nèi)在狀態(tài)和外在狀態(tài),使系統(tǒng)邏輯變?yōu)閺?fù)雜了,使系統(tǒng)更加難于理解了。

      擴(kuò)展

        我們再看看享元模式和之前我們有提到過的原型模式和單例模式的一些區(qū)別吧。我們首先回顧下前面所說的原型模式和單例模式:
          原型模式:使用原型實例指定創(chuàng)建對象的種類,然后通過拷貝這些原型來創(chuàng)建新的對象。


          單例模式:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。

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

        原型模式——享元模式


          我們再來分析,原型模式是通過原型實例指定創(chuàng)建對象。達(dá)到類的復(fù)用。通過深淺拷貝類來實現(xiàn)復(fù)用以節(jié)約資源開銷。再看享元模式抽出相似的一些對象,定義其內(nèi)在狀態(tài)和外在狀態(tài)來達(dá)到對象共享。運用共享的技術(shù)來支持大量細(xì)粒度的對象。也就是前面更傾向于實現(xiàn)復(fù)用,而享元模式更加傾向于共享使用。所以也不適合放一起進(jìn)行比較的。

        單例模式——享元模式


          我們再看單例模式,單例模式保證的是類僅有一個實例,然后提供一個全局訪問點,所有訪問都可以訪問得到。達(dá)到的是一個實例數(shù)據(jù)的共享。我們再看享元模式,享元模式通過的是將相似的對象進(jìn)行共享,然后控制內(nèi)在狀態(tài)和外在狀態(tài)來達(dá)到變化。享元模式是對象級別的,也就是實現(xiàn)的是多個對象——對象池。而單例模式是一類一個對象的實例。享元模式更加注重的是節(jié)約內(nèi)存空間,提高其性能。然而單例模式注重的是數(shù)據(jù)的共享。

      總結(jié)


        今天的享元模式就暫時介紹的這么多,享元模式精髓也就是達(dá)到對象的共享,達(dá)到共享的話就需要抽出一部分東西達(dá)到相似。所以這又區(qū)分了內(nèi)在狀態(tài)和外在狀態(tài)。內(nèi)在狀態(tài)不隨環(huán)境變化而變化,屬于可共享的。而外在狀態(tài)隨著環(huán)境改變而改變,所以不能共享的。在.Net開發(fā)中,我們經(jīng)常使用到的額String類型的實現(xiàn)就采用了享元模式的設(shè)計。
      在string中具有相同字符序列的String對象不會重復(fù)創(chuàng)建。
      具體細(xì)節(jié)想要研究的可以自行查詢資料。在我們使用設(shè)計模式的時候有一些點還是需要多次強調(diào)及注意的。基于原則設(shè)計。視情況采用設(shè)計模式。不要為了使用設(shè)計模式而去使用設(shè)計模式。一切都是為了重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。

        勇敢的面對不一定成功,但你不面對就一定不成功。

          C#設(shè)計模式系列目錄 <https://www.cnblogs.com/hulizhong/p/11394686.html>

      歡迎大家掃描下方二維碼,和我一起踏上設(shè)計模式的闖關(guān)之路吧!

        

      ?

      友情鏈接
      ioDraw流程圖
      API參考文檔
      OK工具箱
      云服務(wù)器優(yōu)惠
      阿里云優(yōu)惠券
      騰訊云優(yōu)惠券
      京東云優(yōu)惠券
      站點信息
      問題反饋
      郵箱:[email protected]
      QQ群:637538335
      關(guān)注微信

        <ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>
          俺去啦综合 | 全部孕妇毛片丰满孕妇孕交最新章节免费阅读 | 天天操综合网 | 伊人久久视频 | 99re6国产露脸精品视频网站 | chaopeng超碰永久 | 亚洲另类小说图片 | 国产亚洲 久一区二区写真 | 欧洲做受高潮片 | 中文字幕永久在线 |