一、什么是单例模式?
1、含义
作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
2、代码
class Singleton
{
private static Singleton instance;
//构造方法私有,堵死了外界利用new创建此类实例的可能
private Singleton()
{
}
//声明为static,提供了获得本类实例的唯一全局访问点
public static Singleton GetInstance()
{
if (instance ==null ) //若实例不存在,则new一个新实例,否则返回已有的实例
{
instance = new Singleton();
}
return instance;
}
}
3、三个要点:
(1). 需要一个保存类的唯一实例的静态成员变量,因为GetInstance()是static类型,静态方法中只能使用静态数据成员,不能使用非静态数据成员。
private static Singleton instance;
(2). 构造函数必须声明为私有的,防止外部程序new类从而失去单例模式的意义。
//构造方法私有,堵死了外界利用new创建此类实例的可能
private Singleton()
{ }
(3). 必须提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一实例的一个引用 ,因为单例模式就是保证一个类只有一个实例,所以GetInstance()必须声明为static类型。
public staticSingleton GetInstance()
{
if (instance ==null ) //若实例不存在,则new一个新实例,否则返回已有的实例
{
instance = new Singleton();
}
return instance;
}
public static functiongetInstance()
二、实际应用
在机房收费合作开发时,我们会频繁用到数据库助手类SQLHelper,也会频繁用到工厂类DBFactory,这两个类都可以使用单例模式保证他们只能有一个实例化的对象存在。
这里以SQLHelper为例。
Public ClassSQLHelper
Private Shared conn As SqlConnection
Private Shared cmd As SqlCommand
Private Shared sdr As SqlDataReader
Private Shared sqlhelper As SQLHelper
'声明为shared,提供了获得本类实例的唯一全局访问点
Public Shared Function GetSqlhelper() As SQLHelper
If sqlhelper = nothing Then '若实例不存在,则new一个新实例,否则返回已有的实例
sqlhelper = New SQLHelper()
End If
Return sqlhelper
End Function
'构造方法私有,堵死了外界利用new创建此类实例的可能
Private Sub New()
Dim connstr As String =System.Configuration.ConfigurationManager.AppSettings("connStr")
conn = New SqlClient.SqlConnection(connstr)
End Sub
Private Shared Function GetConn() As SqlConnection
If conn.State = ConnectionState.Closed Then
conn.Open()
Return conn
Else
Return conn
End If
End Function
Public Shared Function ExecuteNonQuery(ByVal sqlAs String) As Boolean
Dim conn As SqlConnection = GetConn()
Dim cmd As SqlCommand = New SqlCommand(sql, conn)
Ifcmd.ExecuteNonQuery() > 0Then
conn.Close()
Return True
Else
Return False
End If
End Function
End Class
三、优缺点
优点
一、实例控制
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
二、灵活性
因为类控制了实例化过程,所以类可以灵活更改实例化过程。
缺点
一、开销
虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。
二、可能的开发混淆
使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
三、对象生存期
不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。
四、总结
其实单例模式通常有三种形式的,在最上面我给出的是第一种,也就是大家最常用的形式;第二种是在自己内部定义自己的一个实例,只供内部调用;第三种是双重锁形式。由于自已能力有限,只能理解到这里,然后将代码照猫画虎改变过来,其实质性的东西还需要以后慢慢理解,希望大家给出宝贵意见。