設計模式_創建型模式_單例模式_案例
阿新 • • 發佈:2018-03-14
輸出結果 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 voidAddServer(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 }
輸出結果:
設計模式_創建型模式_單例模式_案例