码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式

时间:2015-12-25 13:02:39      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

单例模式就是在程序的全局只能有一个实例。

如何实现单例模式:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!