原文引自:http://www.cnblogs.com/lonelyxmas/p/3720808.html
单例模式
单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点。//一般使用第三种实现方式
一、常用模式:
public class Singleton { private static Singleton instance; private Singleton() { } public static Singleton GetInstance() { if(instance==null) { instance=new Singleton(); } return instance; } }
这种模式只适用在单线程下,并没有考虑到线程并发的问题,在多线程中,可能出现两个线程同时获取Instance的实例,可能会出现多个实例对象。
二、多线程下Lazy模式:
public class Singleton
{
private static Singleton instance;
private static object _lock=new object();
private Singleton()
{
}
public static Singleton GetInstance()
{
if(instance==null)
{
lock(_lock)
{
if(instance==null)
{
instance=new Singleton();
}
}
}
return instance;
}
}
使用了Lock锁,可以较好的解决多线程下单例模式的实现,lock锁保证同一时间内只有一个线程能访问Lock里面的语句块,比较有效的解决性能的开销。
三、饿汉模式
public sealed class Singleton
{
private static readonly Singleton instance=new Singleton();
private Singleton()
{
}
public static Singleton GetInstance()
{
return instance;
}
}
该类标记为 sealed 以阻止发生派生,而派生可能会增加实例。使用的readonly关键可以跟static一起使用,用于指定该常量是类别级的,它的初始化交由静态构造函数实现,并可以在运行时编译。在这种模式下,无需自己解决线程安全性问题,CLR会给我们解决。由此可以看到这个类被加载时,会自动实例化这个类,而不用在第一次调用GetInstance()后才实例化出唯一的单例对象。
原型模式:
原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype
原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与其他模式混用,他的原型类Prototype也常用抽象类来替代
abstract class Prototype
{
private string id;
public Prototype(string id)
{
this.id = id;
}
public string ID
{
get { return id; }
}
public abstract Prototype Clone();
}
class ConcretePrototype : Prototype
{
public ConcretePrototype(string id):base(id)
{}
public override Prototype Clone()
{
//克隆当前对象,浅复制
return (Prototype)this.MemberwiseClone();
}
}
class Program
{
static void Main(string[] args)
{
ConcretePrototype p1 = new ConcretePrototype("I");
ConcretePrototype c1 = (ConcretePrototype)p1.Clone();//克隆ConcretePrototype的对象p1就能得到新的实例c1.
Console.WriteLine("Cloned:{0}", c1.ID);
Console.Read();
}
}