1. 程式人生 > >設計模式_創建型模式_單例模式_案例

設計模式_創建型模式_單例模式_案例

輸出結果 tel pattern 對象 技術 圖片 保存 null urn

轉載自:http://blog.csdn.net/lovelion 作者:劉偉

負載均衡器的設計與實現

技術分享圖片

Sunny公司開發人員通過分析和權衡,決定使用單例模式來設計該負載均衡器,結構圖如圖3-3所示:

技術分享圖片

在圖中,將負載均衡器LoadBalancer設計為單例類,其中包含一個存儲服務器信息的集合serverList,

每次在serverList中隨機選擇一臺服務器來響應客戶端的請求,實現代碼如下所示:

LoadBalance:

 1 namespace SingletonPattern
 2 {
 3     /// <summary>
 4     /// 負載均衡器器(單例模式)
 5     ///
</summary> 6 public class LoadBalance 7 { 8 private static LoadBalance _instance = null; //保存當前類的唯一實例 9 private List<String> ServerList = null; //服務器列表 10 11 private LoadBalance() 12 { 13 ServerList = new List<string>(); 14 }
15 //供外部調用,用於返回當前類的唯一實例 16 public static LoadBalance GetInstance() 17 { 18 if (_instance == null) 19 { 20 _instance = new LoadBalance(); 21 } 22 return _instance; 23 } 24 25 //增加服務器 26 public void
AddServer(string server) 27 { 28 ServerList.Add(server); 29 } 30 31 //刪除服務器 32 public void RemoveServer(string server) 33 { 34 ServerList.Remove(server); 35 } 36 //隨機獲取一個服務器,來實現負載均衡器 37 public String GetRandomServer() 38 { 39 if (ServerList.Count > 0) 40 { 41 //使用隨機數時,需要進行沿時,否則容易產生隨機生成一堆相同的數據 42 Thread.Sleep(10); 43 Random random = new Random(); 44 int index = random.Next(0, ServerList.Count); 45 return ServerList[index]; 46 } 47 return null; 48 } 49 } 50 }

Program:

 1 namespace SingletonPattern
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             //實例化四個對象進行測試
 8             LoadBalance balance1, balance2, balance3, balance4;
 9             balance1 = LoadBalance.GetInstance();
10             balance2 = LoadBalance.GetInstance();
11             balance3 = LoadBalance.GetInstance();
12             balance4 = LoadBalance.GetInstance();
13 
14             //判斷下這四個對象是否是同一個對象?
15             //如果不相同,就違法了單例模式
16             //相同的話,就符合單例模式
17             if(balance1.Equals(balance2) || balance1.Equals(balance3) || balance1.Equals(balance4))
18                 Console.WriteLine("對象1與所有對象都相同,符合單例模式");
19             else
20                 Console.WriteLine("對象1與其它對象不相同,不符合單例模式");
21             
22             //增加服務器
23             balance1.AddServer("服務器1:127.0.0.1");
24             balance1.AddServer("服務器2:222,222,222,222");
25             balance1.AddServer("服務器3:333,333,333,333");
26             balance1.AddServer("服務器4:444,444,444,444");
27 
28             //模擬客戶端請求的分發,隨機獲取一個服務器
29             for (int i = 0; i < 10; i++)
30             {
31                 Console.WriteLine("分發請求:" + balance1.GetRandomServer());
32             }
33             Console.Read();
34         }
35     }
36 }

輸出結果:

技術分享圖片

設計模式_創建型模式_單例模式_案例