单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。
实现思路:在类中的私有方法外界不能访问,把实例放在私有方法中,通过同类中 的公有静态方法去把实例实现。外界可以调用公有接口以实现实例,再对公有接口进行限制,使得它一次只能生成一次实例。
简单的单利模式实现code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _20170920
{
class Singleton
{
private static Singleton instance;
private Singleton() { }
public static Singleton GetInstance()
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
class Program
{
static void Main(string[] args)
{
Singleton c1 = Singleton.GetInstance();
Singleton c2 = Singleton.GetInstance();
if (c1 == c2)
Console.WriteLine("相同实例");
Console.ReadKey();
}
}
}
多线程时的单例模式需要加锁:为了保证多线程访问也只能生成一个实例
双重加锁code::
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _20170920
{
class Singleton
{
private static readonly object synRoot = new object();//创建一个静态只读对象进行辅助访问
private static Singleton instance;
private Singleton() { }
public static Singleton GetInstance()
{
if (instance == null)
{
lock (synRoot)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
class Program
{
static void Main(string[] args)
{
Singleton c1 = Singleton.GetInstance();
Singleton c2 = Singleton.GetInstance();
if (c1 == c2)
Console.WriteLine("相同实例");
Console.ReadKey();
}
}
}
双重判断instance ==null ,是为了防止这样的情况:当instance==null 时,如果有两个进程同时通过了instance==null 的判断,一个进入了lock区,另外一个在外等候,当进入lock的完成创建时并退出由另外一个进入,如果此时没有instance ==null 的判断的话,这时候进入的也会创建一个instance,这时就达不到单例的效果了。。