1、類圖
實例圖
2、創建項目
………………………………
3、 新建周報類LoadBalancer:負載均衡器類,充當單例角色,在真實環境下該類非常復雜,包括大量初始化的工作和業務方法,考慮到代碼的可讀性和易理解性,在此只列出部分與模式相關的核心代碼。
using System;
using System.Collections;
using System.Threading;
namespace SingletonSample
{
class LoadBalancer
{
//私有靜態成員變量,存儲唯一實例
private static LoadBalancer instance = null;
//服務器集合
private ArrayList serverList = null;
//私有構造函數
private LoadBalancer()
{
serverList = new ArrayList();
}
//公有靜態成員方法,返回唯一實例
public static LoadBalancer GetLoadBalancer()
{
if (instance == null)
{
instance = new LoadBalancer();
}
return instance;
}
//增加服務器
public void AddServer(string server)
{
serverList.Add(server);
}
//刪除服務器
public void RemoveServer(string server)
{
serverList.Remove(server);
}
//使用Random類隨機獲取服務器
public string GetServer()
{
Random random = new Random();
Thread.Sleep(10); //適度的線程等待可以保證隨機數生成的不是上一次的結果
int i = random.Next(serverList.Count);
return serverList[i].ToString();
}
}
}
4、 新建Singleton類:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SingletonSample
{
public class Singleton
{
private static Singleton _singleton = null; //定義私有的靜態成員變量——唯一的實例對象
/// <summary>
/// 定義私有的構造函數,防止被外界實例化
/// </summary>
private Singleton()
{
}
/// <summary>
/// 定義公開的唯一的方位(工廠)方法,返回系統的唯一實例,實現自己創建自己
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
if (_singleton == null)
_singleton = new Singleton(); //如果為null,則實例化自己
return _singleton;
}
}
}
5、 Program:客戶端測試類
using System;
namespace SingletonSample
{
class Program
{
static void Main(string[] args)
{
#region 測試單例,比較是否是同一個實例
Singleton singleton1 = Singleton.GetInstance(); //創建單例對象1
Singleton singleton2 = Singleton.GetInstance(); //創建單例對象1
if (singleton1 == singleton2)
{
Console.WriteLine("singleton1與singleton2為:同一實例。");
}
else
{
Console.WriteLine("singleton1與singleton2為:不是同一實例。");
}
Console.Read();
#endregion
#region 案例
//創建四個LoadBalancer對象
LoadBalancer balancer1,balancer2,balancer3,balancer4;
balancer1 = LoadBalancer.GetLoadBalancer();
balancer2 = LoadBalancer.GetLoadBalancer();
balancer3 = LoadBalancer.GetLoadBalancer();
balancer4 = LoadBalancer.GetLoadBalancer();
//判斷服務器負載均衡器是否相同
if (balancer1 == balancer2 && balancer2 == balancer3 && balancer3 == balancer4)
{
Console.WriteLine("服務器負載均衡器具有唯一性!");
}
//增加服務器
balancer1.AddServer("Server 1");
balancer1.AddServer("Server 2");
balancer1.AddServer("Server 3");
balancer1.AddServer("Server 4");
//模擬客戶端請求的分發,如果輸出結果全為同一個server,可以將i適當放大,例如改為"i < 100"
int num = 10;
for (int i = 0; i < num; i++)
{
string server = balancer1.GetServer();
Console.WriteLine("分發請求至服務器: " + server);
}
Console.Read();
#endregion
}
}
}