Head First設計模式之單例模式


一、定義

保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。通過單例模式可以保證系統中一個類只有一個實例。即一個類只有一個對象實例。

 

  • Singleton模式中的實例構造器可以設置為protected以允許子類派生。
  • Singleton模式一般不要支持ICloneable接口,因為這可能會導致多個對象實例,與Singleton模式的初衷違背。
  • Singleton模式一般不要支持序列化,因為這也有可能導致多個對象實例,同樣跟Singleton模式的初衷違背。
  • Singleton模式只考慮到了對象創建的管理,並沒有考慮對象銷毀的管理。就支持垃圾回收的平台和對象的開銷來講,我們一般沒必要對其銷毀進行特殊的管理。

 

二、結構

創建一個 SingleObject 類。SingleObject 類有它的私有構造函數和本身的一個靜態實例。

SingleObject 類提供了一個靜態方法,供外界獲取它的靜態實例。

三、適用場景

 1、要求生產唯一序列號。

2、WEB 中的計數器,不用每次刷新都在數據庫里加一次,用單例先緩存起來。

3、創建的一個對象需要消耗的資源過多,比如 I/O 與數據庫的連接等。

 

四、優缺點

優點: 

1、在內存里只有一個實例,減少了內存的開銷,尤其是頻繁的創建和銷毀實例(比如管理學院首頁頁面緩存)。

2、避免對資源的多重占用(比如寫文件操作)。

缺點:

沒有接口,不能繼承,與單一職責原則沖突,一個類應該只關心內部邏輯,而不關心外面怎么樣來實例化。

五、實現

 單例模式的實現有多種方式

1、線程不安全 

    public sealed class Singleton
{
public int Count { get; set; }

private static Singleton instance = null;

public static Singleton Instance
{
get
{
if (instance == null)
{
instance
= new Singleton();
}
return instance;
}
}

private Singleton()
{
Count
= DateTime.Now.Millisecond;
}
}

public class SimpleSingleton
{
private SimpleSingleton() { }
public static readonly SimpleSingleton instance = new SimpleSingleton();
}

 

說明:SimpleSingleton是 Singleton 的簡化版,它利用.NET的特性寫的,其實和Singleton 一樣

 

2.線程安全 

    /// <summary>
/// 單例-線程安全
/// </summary>
public sealed class SafeSingleton
{
public int Count { get; set; }

private static SafeSingleton instance = null;

private static readonly object safeLock = new object();

public static SafeSingleton Instance
{
get
{
if (instance == null)
{
lock (safeLock)
{
if (instance == null)
{
instance
= new SafeSingleton();
}
}
}
return instance;
}
}

private SafeSingleton()
{
Count
= DateTime.Now.Millisecond;
}
}

 

3.單例測試

 

class Program
{
static void Main(string[] args)
{
SayName();
SayNewName();
Thread.Sleep(
1000);
}

private static async Task SayName()
{
await Task.Run(() =>
{
var s = Singleton.Instance;
Console.WriteLine(
"count:" + s.Count);
var s1 = SafeSingleton.Instance;
Console.WriteLine(
"【safe】 count:" + s1.Count);
});
}

private static async Task SayNewName()
{
await Task.Run(() =>
{
var s = Singleton.Instance;
Console.WriteLine(
"new count:" + s.Count);
var s1 = SafeSingleton.Instance;
Console.WriteLine(
"【safe】 new count:" + s1.Count);
});
}
}

結果

 

 4、單例模式的復用

代碼

/// <summary>
/// 4、使用 C# 2.0 泛型來完成單例模式的重用
/// </summary>
/// <typeparam name="T"></typeparam>
public class SingletonProvider<T> where T : new()
{
SingletonProvider() { }

public static T Instance
{
get { return SingletonCreator.instance; }
}

class SingletonCreator
{
static SingletonCreator() { }

internal static readonly T instance = new T();
}
}
/// <summary>
/// 4、業務類demo
/// </summary>
public class TestClass
{
private string _createdTimestamp;

public TestClass()
{
_createdTimestamp
= DateTime.Now.ToString();
}

public void Write()
{
Console.WriteLine(_createdTimestamp);
}
}
/// <summary>
/// 4、范型單例示例
/// </summary>
public class demo
{
private void dosomething()
{
SingletonProvider
<TestClass>.Instance.Write();
}
}

 

 

 參考:

http://www.runoob.com/design-pattern/singleton-pattern.html

http://blog.csdn.net/dabian1987/article/details/6951652

http://blog.csdn.net/jiankunking/article/details/50867050

 http://www.cnblogs.com/kmsfan/p/4562323.html

 http://www.cnblogs.com/dreign/archive/2012/05/08/2490212.html(推薦)

 

歡迎閱讀本系列文章:Head First設計模式之目錄 

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com