【云圖說】第235期 DDS讀寫兩步走 帶您領略只讀節點的風采
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
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
ConnectionFactory類,數據庫連接工廠,內部維持對所有連接的引用,CreateConnection方法在發現連接存在時直接返回,如果不存在,則創建一個新的連接并維持進列表。
注:實際開發過程中應該用HashCode來檢索數據庫連接是否存在。
public class Program { private static ConnectionFactory _factory = null; private static List
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小時內刪除侵權內容。