using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Threading;
namespace DesignFactory.Singleton
{
class SingletonPattern
{
}
class LoadBalancer
{
private static LoadBalancer balancer;
private ArrayList servers = new ArrayList();
private Random random = new Random();
protected LoadBalancer()
{
servers.Add("Server1");
servers.Add("Server2");
servers.Add("Server3");
servers.Add("Server4");
servers.Add("Server5");
}
public static LoadBalancer GetLoadBalancer()
{
if (balancer == null)
{
Mutex mutex = new Mutex();
mutex.WaitOne();
if(balancer == null)
{
balancer = new LoadBalancer();
}
mutex.Close();
}
return balancer;
}
public string Server
{
get {
int r = random.Next(servers.Count);
return servers[r].ToString();
}
}
}
class SingletonApp
{
public static void Main(string[] args)
{
LoadBalancer b1 = LoadBalancer.GetLoadBalancer();
LoadBalancer b2 = LoadBalancer.GetLoadBalancer();
LoadBalancer b3 = LoadBalancer.GetLoadBalancer();
LoadBalancer b4 = LoadBalancer.GetLoadBalancer();
if ((b1 == b2) && (b2 == b3) && (b3 == b4))
{
Console.WriteLine("Same instance");
}
Console.WriteLine(b1.Server);
Console.WriteLine(b2.Server);
Console.WriteLine(b3.Server);
Console.WriteLine(b4.Server);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Threading;
namespace DesignFactory.Singleton
{
#region 方法一
/// <summary>
/// Sealed 保证该类不回被继承
/// 私有的构造函数和readonly保证了Singleton 不会被再次实例化
/// 缺点:无法继承 实力在程序一运行就被初始化,无法实现延迟初始化
/// </summary>
sealed class Singleton
{
private Singleton();
public static readonly Singleton Instance = new Singleton();
}
#endregion
#region 方法二
/// <summary>
/// 实现延迟初始化 并具有很多优势,也有一些缺点
/// 详细内容参考Implementing the Singleton Pattern in c#
/// 文章包含五种 Singleton实现 就模式 线程 效率 延迟初始化等方面进行了详细论述
/// </summary>
public sealed class Singleton2
{
Singleton2()
{ }
public static Singleton2 GetInstance()
{
return Nested.instance;
}
class Nested
{
static Nested()
{ }
internal static readonly Singleton2 instance = new Singleton2();
}
}
#endregion
}