(精華)2020年8月29日 二十三種設計模式(十一)-享元模式(Flyweight Pattern)

      網友投稿 724 2025-04-03

      享元模式(Flyweight Pattern)

      享元模式屬于結構型模式,它以共享的方式高效的支持大量的細粒度對象。通過復用內存中已存在的對象,降低系統創建對象實例的性能消耗。

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

      角色

      1、抽象享元(Flyweight)

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

      2、具體享元(Concrete Flyweight)

      具體享元類實現了抽象享元類所規定的接口;

      3、享元工廠(FlyweightFactoiy)

      享元工廠類負責創建和管理享元對象。

      示例

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

      public interface IConnection { void Print(); }

      1

      2

      3

      4

      5

      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("-------------------------------------------------------"); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

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

      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; } } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      (精華)2020年8月29日 二十三種設計模式(十一)-享元模式(Flyweight Pattern)

      23

      24

      25

      ConnectionFactory類,數據庫連接工廠,內部維持對所有連接的引用,CreateConnection方法在發現連接存在時直接返回,如果不存在,則創建一個新的連接并維持進列表。

      注:實際開發過程中應該用HashCode來檢索數據庫連接是否存在。

      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(); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      以上是調用方的代碼,以下是這個案例的輸出結果:

      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!

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      優點

      1、降低了系統中對象的數量,從而降低了系統中細粒度對象給內存帶來的壓力。

      缺點

      1、為了使對象可以共享,需要將一些狀態外部化,這使得程序的邏輯更復雜,使系統復雜化;

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

      使用場景

      1、一個系統中有大量的對象;

      2、這些對象耗費大量的內存;

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

      4、這些對象可以按照內部狀態分成很多的組,當把外部對象從對象中剔除時,每一個組都可以僅用一個對象代替;

      5、軟件系統不依賴這些對象的身份。

      數據庫

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Excel使用YIELD函數計算債券的收益率
      下一篇:為什么總是金山文檔修復
      相關文章
      亚洲啪啪AV无码片| 亚洲人成无码网站在线观看| 久久人午夜亚洲精品无码区| 亚洲欧美日韩国产精品一区| 亚洲天堂2017无码中文| 亚洲啪啪免费视频| 亚洲日韩乱码中文无码蜜桃| 亚洲美女大bbbbbbbbb| 亚洲综合网美国十次| 久久久久久亚洲精品成人| 亚洲无线电影官网| 久久精品亚洲精品国产色婷 | 久久亚洲sm情趣捆绑调教| 亚洲欧洲国产精品你懂的| 亚洲成人免费在线| 内射干少妇亚洲69XXX| 亚洲第一精品电影网| 亚洲中文字幕久久精品无码2021| 亚洲日韩乱码中文无码蜜桃| 亚洲av永久无码嘿嘿嘿| 久久国产亚洲精品| 久久亚洲精品无码网站| 亚洲福利在线播放| 久久久久亚洲精品天堂久久久久久 | 亚洲AV无码成人网站久久精品大| 亚洲成AV人片在WWW色猫咪| 亚洲国产精品lv| 亚洲日韩在线视频| 亚洲国产91在线| 亚洲AV永久无码天堂影院| 国产亚洲精品免费| 在线观看亚洲精品福利片| 国产亚洲综合成人91精品 | 亚洲Av无码国产一区二区| 国产亚洲男人的天堂在线观看| 亚洲男人在线无码视频| 国产精品亚洲一区二区三区在线 | 亚洲国产精品自在线一区二区| 亚洲婷婷综合色高清在线| 亚洲kkk4444在线观看| 日韩亚洲精品福利|