設計模式之單例模式(一)

1、單例模式(建立型模式)安全

2、動機:多線程

在軟件系統中,常常有這樣一些特殊的類,必須保證它們在系統中只存在一個實例,才能確保它們的邏輯正確性、以及良好的效率。性能

§如何繞過常規的構造器,提供一種機制來保證一個類只有一個實例?spa

這應該是類設計者的責任,而不是使用者的責任線程

3、意圖:設計

保證一個類僅有一個實例,並提供一個該實例的全局訪問點。對象

4、實現:接口

(01)get

    

public sealed class Singletonclass

    {

        static Singleton instance = null;

 

        private Singleton()

        {

        }

 

        public static Singleton Instance

        {

            get

            {

                if (instance == null)

                {

                    instance = new Singleton();

                }

                return instance;

            }

        }

    }

 

注意:

對於線程來講不安全

單線程中已知足要求

優勢:

因爲實例是在 Instance 屬性方法內部建立的,所以類可使用附加功能

直到對象要求產生一個實例才執行實例化;這種方法稱爲「惰性實例化」。惰性實例化避免了在應用程序啓動時實例化沒必要要的 singleton。

 

(02)

 

public sealed class Singleton

    {

        private static Singleton instance = null;

        private static readonly object padlock = new object();

 

        private Singleton()

        {

        }

        public static Singleton Instance

        {

            get

            {

 

                    lock (padlock)

                    {

                        if (instance == null)

                        {

                            instance = new Singleton();

                        }

                    }

 

                return instance;

            }

        }

    }

注意:

同一個時刻加了鎖的那部分程序只有一個線程能夠進入

對象實例由最早進入的那個線程建立

後來的線程在進入時(instence == null)爲假,不會再去建立對象實例

增長了額外的開銷,損失了性能

 

(03)

public sealed class Singleton

    {

        private static Singleton instance = null;

        private static readonly object padlock = new object();

 

        private Singleton()

        {

        }

        public static Singleton Instance

        {

            get

            {

                if (instance == null)

                {

                    lock (padlock)

                    {

                        if (instance == null)

                        {

                            instance = new Singleton();

                        }

                    }

                }

                return instance;

            }

        }

    }

注意:

多線程安全

線程不是每次都加鎖

容許實例化延遲到第一次訪問對象時發生

 

(04)

 

public sealed class Singleton

    {

        private static readonly Singleton instance =null;

 

   static Singleton()

        {

  instance = new Singleton();

        }

 

        private Singleton()

        {

        }

 

        public static Singleton Instance

        {

            get

            {

                return instance;

            }

        }

    }

注意:

依賴公共語言運行庫負責處理變量初始化

公共靜態屬性爲訪問實例提供了一個全局訪問點

對實例化機制的控制權較少(.NET代爲實現)

靜態初始化是在 .NET 中實現 Singleton 的首選方法

 

(05)

public sealed class Singleton

    {

        private Singleton()

        {

        }

 

        public static Singleton Instance

        {

            get

            {

                return Nested.instance;

            }

        }

 

        private class Nested

        {

            static Nested()

            {

  instance= new Singleton();

            }

 

            internal static readonly Singleton instance=null;

        }

    }

注意:初始化工做由Nested類的一個靜態成員來完成,這樣就實現了延遲初始化

 

五:注意事項:

Singleton模式中的實例構造器能夠設置爲protected以容許子類派生。

Singleton模式通常不要支持ICloneable接口,由於這可能會致使多個對象實例,與Singleton模式的初衷違背。

Singleton模式通常不要支持序列化,由於這也有可能致使多個對象實例,一樣與Singleton模式的初衷違背。

Singletom模式只考慮到了對象建立的管理,沒有考慮對象銷燬的管理。就支持垃圾回收的平臺和對象的開銷來說,咱們通常沒有必要對其銷燬進行特殊的管理。

Singleton模式是限制而不是改進類的建立。

理解和擴展Singleton模式的核心是「如何控制用戶使用new對一個類的構造器的任意調用」。

能夠很簡單的修改一個Singleton,使它有少數幾個實例,這樣作是容許的並且是有意義的。 

相關文章
相關標籤/搜索