标签:
单例模式就是在程序的全局只能有一个实例。
如何实现单例模式:
public class Instance1 { private static SendMessage sendInstance; private static object _lock = new object(); protected Instance1() { } public static SendMessage SInstance { get { lock (_lock) { if (sendInstance == null) sendInstance = new SendMessage(); return sendInstance; } } } }
1、要控制全局只有一个实例的类,请定义成静态实例,这样可以确保只有一个实例对象。
2、这个对象的构造函数请声明成保护类型的成员,这样可以屏蔽通过直接实例化的形式来访问。
在多线程的情况下采用这样的形式还会有一定的弊端,当然我们这里也简单的讲解下相应的控制方案。方案如下:
public class CoolInstance { private CoolInstance() { } public static readonly CoolInstance Instance = new CoolInstance(); /// <summary> /// 发送邮件 /// </summary> /// <param name="content"></param> /// <param name="toMail"></param> public bool SendMail(string content,string toMail) { return true; } }
//发送邮件 CoolInstance.Instance.SendMail(string.Empty, string.Empty);
看吧很简单吧,当然我们这里来简单解释下原理:
1、我们先把构造函数定义为私有,这样我们能够屏蔽外部通过实例化的形式访问内部的成员函数。所有的成员函数的访问必须通过静态成员Instance访问。
2、这段代码通过定义公共、静态、只读的成员相当于在类被第一次使用时执行构造,由于是只读的,所以一旦构造后不允许修改,就不用担心不安全的问题。
可更新的单例模式
public class UpdateHelper { private string type = string.Empty; private static object _lock = new object(); private static UpdateHelper instance; private UpdateHelper(string valueType) { type = valueType; } public static UpdateHelper Instance { get { lock (_lock) { if (instance == null) { //如果这里有多个条件需求的话,可能写起来会比较复杂,那么有更好的方式来处理吗? instance = new UpdateHelper(System.Configuration.ConfigurationManager.AppSettings["ssss"].ToString()); } return instance; } } } }
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.Web> <add key="ssss" >value</add> </system.Web> </configuration>
参考文档:
http://www.cnblogs.com/hegezhou_hot/archive/2010/10/02/1841390.html
标签:
原文地址:http://www.cnblogs.com/lystory/p/5075450.html