<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在軟體系統中,採用純粹物件方案的問題在於大量細粒度的物件會很快充斥在系統中,從而帶來很高的執行時代價——主要指記憶體需求方面的代價。如何在避免大量細粒度物件問題的同時,讓外部客戶程式仍然能夠透明地使用物件導向的方式來進行操作?
運用共用技術有效地支援大量細粒度的物件。 ——《設計模式》GoF
(1)、抽象享元角色(Flyweight):此角色是所有的具體享元類的基礎類別,為這些類規定出需要實現的公共介面。那些需要外部狀態的操作可以通過呼叫方法以引數形式傳入。
(2)、具體享元角色(ConcreteFlyweight):實現抽象享元角色所規定的介面。如果有內部狀態的話,可以在類內部定義。
(3)、享元工廠角色(FlyweightFactory):本角色負責建立和管理享元角色。本角色必須保證享元物件可以被系統適當地共用,當一個使用者端物件呼叫一個享元物件的時候,享元工廠角色檢查系統中是否已經有一個符合要求的享元物件,如果已經存在,享元工廠角色就提供已存在的享元物件,如果系統中沒有一個符合的享元物件的話,享元工廠角色就應當建立一個合適的享元物件。
(4)、使用者端角色(Client):本角色需要儲存所有享元物件的外部狀態。
/// <summary> /// 享元的抽象類 /// </summary> public abstract class Flyweight { public abstract void Operation(int extrinsicState); } /// <summary> /// 需要共用的具體類 /// </summary> public class ConceteFlyweight : Flyweight { public override void Operation(int extrinsicState) { Console.WriteLine("需要共用的具體Flyweight類:" + extrinsicState); } } /// <summary> /// 不需要共用的具體類 /// </summary> public class UnsharedConcreteFlyeight : Flyweight { public override void Operation(int extrinsicState) { Console.WriteLine("不需要共用的具體Flyweight類:" + extrinsicState); } } /// <summary> /// 一個工廠類,用來合理建立物件 /// </summary> public class FlyweightFactory { private Dictionary<string, Flyweight> dic = new Dictionary<string, Flyweight>(); public Flyweight GetFlyweight(string key, bool type) { if (!dic.ContainsKey(key)) { Flyweight flyweight = new UnsharedConcreteFlyeight(); if (type) flyweight = new ConceteFlyweight(); dic.Add(key, flyweight); } return (Flyweight)dic[key]; } } /// <summary> /// 使用者端呼叫 /// </summary> public class App { static void Main() { int extrinsicState = 26; FlyweightFactory factory = new FlyweightFactory(); Flyweight f1 = factory.GetFlyweight("oec2003", true); f1.Operation(++extrinsicState); Flyweight f2 = factory.GetFlyweight("oec2003", true); f2.Operation(++extrinsicState); Flyweight f3 = factory.GetFlyweight("oec2004", false); f3.Operation(++extrinsicState); } }
物件導向很好地解決了抽象性的問題,但是作為一個執行在機器中的程式實體,我們需要考慮物件的代價問題。Flyweight設計模式主要解決物件導向的代價問題,一般不觸及物件導向的抽象性問題。
Flyweight採用物件共用的做法來降低系統中物件的個數,從而降低細粒度物件給系統帶來的記憶體壓力。在具體實現方面,要注意物件狀態的處理。
物件的數量太大從而導致物件記憶體開銷加大——什麼樣的數量才算大?這需要我們仔細的根據具體應用情況進行評估,而不能憑空臆斷。
(1)、享元模式的優點在於它能夠極大的減少系統中物件的個數。
(2)、享元模式由於使用了外部狀態,外部狀態相對獨立,不會影響到內部狀態,所以享元模式使得享元物件能夠在不同的環境被共用。
(1)、由於享元模式需要區分外部狀態和內部狀態,使得應用程式在某種程度上來說更加複雜化了。
(2)、為了使物件可以共用,享元模式需要將享元物件的狀態外部化,而讀取外部狀態使得執行時間變化。
(1)、一個系統中有大量的物件;
(2)、這些物件耗費大量的記憶體;
(3)、這些物件中的狀態大部分都可以被外部化;
(4)、這些物件可以按照內部狀態分成很多的組,當把外部物件從物件中剔除時,每一個組都可以僅用一個物件代替軟體系統不依賴這些物件的身份,滿足上面的條件的系統可以使用享元模式。但是使用享元模式需要額外維護一個記錄子系統已有的所有享元的表,而這也需要耗費資源,所以,應當在有足夠多的享元範例可共用時才值得使用享元模式。
.NET在C#中有一個Code Behind機制,它表面有一個aspx檔案,背後又有一個cs檔案,它的編譯過程實際上會把aspx檔案解析成C#檔案,然後編譯成dll,在這個過程中,我們在aspx中寫的任何html程式碼都會轉化為literal control,literal control是一個一般的文字控制元件,它就表示html標記。當這些標記有一樣的時候,構建控制元件樹的時候就會用到Flyweight模式。
它的應用並不是那麼平凡,只有在效率空間確實不高的時候我們才用它。
到此這篇關於.Net結構型設計模式之享元模式(Flyweight)的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45