愚公系列2021年12月 二十三種設(shè)計模式(十一)-享元模式

      網(wǎng)友投稿 624 2022-05-29

      前言

      設(shè)計模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問,設(shè)計模式于己于他人于系統(tǒng)都是多贏的,設(shè)計模式使代碼編制真正工程化,設(shè)計模式是軟件工程的基石,如同大廈的一塊塊磚石一樣。項目中合理的運用設(shè)計模式可以完美的解決很多問題,每種模式在現(xiàn)在中都有相應(yīng)的原理來與之對應(yīng),每一個模式描述了一個在我們周圍不斷重復(fù)發(fā)生的問題,以及該問題的核心解決方案,這也是它能被廣泛應(yīng)用的原因。

      提示:以下是本篇文章正文內(nèi)容,下面案例可供參考

      一、享元模式(Flyweight Pattern)

      享元模式屬于結(jié)構(gòu)型模式,它以共享的方式高效的支持大量的細(xì)粒度對象。通過復(fù)用內(nèi)存中已存在的對象,降低系統(tǒng)創(chuàng)建對象實例的性能消耗。

      享元模式嘗試重用現(xiàn)有的同類對象,如果未找到匹配的對象,則創(chuàng)建新對象,如果找到對象,則直接返回。

      二、使用步驟

      角色

      1、抽象享元(Flyweight)

      它是所有具體享元類的抽象基類,為其子類規(guī)定出需要實現(xiàn)的公共接口;

      2、具體享元(Concrete Flyweight)

      具體享元類實現(xiàn)了抽象享元類所規(guī)定的接口;

      3、享元工廠(FlyweightFactoiy)

      享元工廠類負(fù)責(zé)創(chuàng)建和管理享元對象。

      示例

      命名空間FlyweightPattern中包含IConnection接口充當(dāng)抽象享元,Connection類充當(dāng)具體享元,ConnectionFactory工廠類充當(dāng)享元工廠。本案例通過使用享元模式來共享數(shù)據(jù)庫連接。

      public interface IConnection { void Print(); }

      IConnection接口,包含一個打印的方法。

      public class Connection : IConnection { private string _connectionString = null; public Connection(string connectionString) { _connectionString = connectionString; Thread.Sleep(1000); Console.WriteLine("It took 1 second(s) to create a connection!"); } public void Print() { Console.WriteLine($"Database connection is {_connectionString}"); Console.WriteLine("-------------------------------------------------------"); } }

      Connection類,定義數(shù)據(jù)庫連接(演示)。

      public class ConnectionFactory { private Dictionary _connections = null; private string _connectionString = null; public ConnectionFactory() { _connections = new Dictionary(); } public IConnection CreateConnection(string connectionString) { if (!_connections.ContainsKey(connectionString)) { Console.WriteLine("Creating a new connection!"); IConnection connection = new Connection(connectionString); _connections.Add(connectionString, connection); return connection; } else { Console.WriteLine("Return an exist connection!"); var connection = _connections[connectionString] as IConnection; return connection; } } }

      【愚公系列】2021年12月 二十三種設(shè)計模式(十一)-享元模式

      ConnectionFactory類,數(shù)據(jù)庫連接工廠,內(nèi)部維持對所有連接的引用,CreateConnection方法在發(fā)現(xiàn)連接存在時直接返回,如果不存在,則創(chuàng)建一個新的連接并維持進(jìn)列表。

      注:實際開發(fā)過程中應(yīng)該用HashCode來檢索數(shù)據(jù)庫連接是否存在。

      public class Program { private static ConnectionFactory _factory = null; private static List _connections = null; private static IConnection _connection = null; private static void Print(int index) { if (index > _connections.Count - 1) { Console.WriteLine("Index Out Of Range Exception!"); return; } _connection = _factory.CreateConnection(_connections[index]); _connection.Print(); } public static void Main(string[] args) { _connections = new List { "Server=Aron1;Database=pubs;\n" + "Uid=uid;Pwd=password;", "Provider=sqloledb;Data Source=Aron1;\n" + "User Id=uid;Password=password;", "Data Source=192.168.0.1,1433;\n" + "UserID=uid;Password=password;" }; _factory = new ConnectionFactory(); Print(0); Print(1); Print(2); Print(1); Print(3); Console.ReadKey(); } }

      以上是調(diào)用方的代碼,以下是這個案例的輸出結(jié)果:

      Creating a new connection! It took 1 second(s) to create a connection! Database connection is Server=Aron1;Database=pubs; Uid=uid;Pwd=password; ------------------------------------------------------- Creating a new connection! It took 1 second(s) to create a connection! Database connection is Provider=sqloledb;Data Source=Aron1; User Id=uid;Password=password; ------------------------------------------------------- Creating a new connection! It took 1 second(s) to create a connection! Database connection is Data Source=192.168.0.1,1433; UserID=uid;Password=password; ------------------------------------------------------- Return an exist connection! Database connection is Provider=sqloledb;Data Source=Aron1; User Id=uid;Password=password; ------------------------------------------------------- Index Out Of Range Exception!

      總結(jié)

      優(yōu)點

      1、降低了系統(tǒng)中對象的數(shù)量,從而降低了系統(tǒng)中細(xì)粒度對象給內(nèi)存帶來的壓力。

      缺點

      1、為了使對象可以共享,需要將一些狀態(tài)外部化,這使得程序的邏輯更復(fù)雜,使系統(tǒng)復(fù)雜化;

      2、享元模式將享元對象的狀態(tài)外部化,而讀取外部狀態(tài)使得運行時間稍微變長。

      使用場景

      1、一個系統(tǒng)中有大量的對象;

      2、這些對象耗費大量的內(nèi)存;

      3、這些對象中的狀態(tài)大部分都可以被外部化;

      4、這些對象可以按照內(nèi)部狀態(tài)分成很多的組,當(dāng)把外部對象從對象中剔除時,每一個組都可以僅用一個對象代替;

      5、軟件系統(tǒng)不依賴這些對象的身份。

      面向?qū)ο缶幊?/p>

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:Hyper-V性能加速之NUMA
      下一篇:圖解進(jìn)程線程、互斥鎖與信號量-看完不懂你來打我
      相關(guān)文章
      亚洲精品视频免费| 国产成人精品日本亚洲专一区| 亚洲性无码一区二区三区| 亚洲自偷自拍另类图片二区| 亚洲AV无码成人精品区在线观看 | 色天使亚洲综合一区二区| 最新亚洲精品国偷自产在线| 亚洲人成网站看在线播放| 亚洲精品第一国产综合野| 亚洲国产系列一区二区三区 | 久久久青草青青国产亚洲免观| 亚洲午夜爱爱香蕉片| 亚洲一区二区三区乱码A| 久久影视国产亚洲| 国产av无码专区亚洲av果冻传媒| 亚洲中文字幕无码一区| 好看的亚洲黄色经典| 亚洲AV乱码久久精品蜜桃| 久久亚洲AV成人出白浆无码国产 | 香蕉视频亚洲一级| 色九月亚洲综合网| 亚洲国产成人精品无码久久久久久综合| 国产精品久久久久久亚洲小说| 亚洲精品动漫人成3d在线| 国产亚洲老熟女视频| 日韩亚洲人成在线综合日本| 亚洲国产精品高清久久久| 久久亚洲AV成人出白浆无码国产| 亚洲欧洲日本精品| 亚洲国产综合精品中文第一| 亚洲爆乳无码精品AAA片蜜桃| 亚洲A丁香五香天堂网| 亚洲小说区图片区另类春色| 亚洲成av人在线视| 久久精品国产亚洲av麻豆小说| 亚洲国产电影在线观看| 亚洲日本天堂在线| 亚洲精品无码日韩国产不卡?V| 亚洲人成亚洲人成在线观看 | 国产成人 亚洲欧洲| 久久亚洲2019中文字幕|