終於完成第一篇開博大篇,下麵緊接著下一個單例模式
單例模式(單件模式) Singleton
定義:
保證一個類僅有一個實例,並提供一個訪問它的全域訪問點,必須自己創建本身實例
其中又分為餓漢模式和懶漢模式
餓漢模式:在類加載的時候就將對象創建好了,不管是否使用,在類卸載之前會一直佔據系統資源.
加載類時速度慢,獲取對象速度快.
懶漢模式:在需要使用的時候,才去創建對象.加載類時速度快,獲取對象速度慢.
實例問題:
業務需求描述: 監控客戶機本地一個文件目錄,當文件目錄中出現新的文件夾時(文件夾命名是按一定規則生成);獲取文件夾名稱提交給服務器然後獲取文件。 服務器上面的文件按定規則命名,同時一個文件只能給一個一台客戶機的一次請求 不可以重複;客戶機獲取完畢會將文件刪除,客戶機數量可能比較多,
UML圖
具體實現:
服務端返回文件實現 Accessfilename.cs
public class Accessfilename
{
私有構成函數,不對外使用new 關鍵字來創建
private Accessfilename()
{}
#region 餓漢模式
private static volatile AccessfilenameaccessfileName = null;
public static Accessfilename CreateAccessfilename()
{
if (accessfileName == null)
{
//多線程 保持同一時間只有一個線程進行
lock (typeof(Accessfilename))
{
if (accessfileName == null)
{
accessfileName = newAccessfilename();
}
}
}
return accessfileName;
}
#endregion
#region 餓漢模式
private static Accessfilename accessfileName = new Accessfilename();
public static Accessfilename CreateAccessfilename()
{
returnaccessfileName ;
}
#endregion
}
客户端调用
public class ClientA
{
Accessfilename file = Accessfilename.CreateAccessfilename();
}
應用場景
在應用程序中 對單文件進行操作,列如:記錄log文件,對同一資源進行分配,創建全局對象調用.
实现要点
Singleton模式是限制而不是改进类的创建。
Singleton类中的实例构造器可以设置为Protected以允许子类派生。
Singleton模式一般不要支持Icloneable接口,因为这可能导致多个对象实例,与Singleton模式的初衷违背。
Singleton模式一般不要支持序列化,这也有可能导致多个对象实例,这也与Singleton模式的初衷违背。
Singleton只考虑了对象创建的管理,没有考虑到销毁的管理,就支持垃圾回收的平台和对象的开销来讲,我们一般没必要对其销毁进行特殊的管理。
理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的构造器的任意调用”。
可以很简单的修改一个Singleton,使它有少数几个实例,这样做是允许的而且是有意义的。
优点
实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例
灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程
缺点
开销:虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题.
可能的开发混淆:使用 singleton 对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用 new 关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
对象的生存期:Singleton 不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于 .NET Framework 的语言),只有 Singleton 类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除
对象实例,但这样会导致 Singleton 类中出现悬浮引用。
适用性
当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
参考:
terrylee .net设计模式手册