1. 程式人生 > >黑馬程式設計師--java單列設計模式

黑馬程式設計師--java單列設計模式



---------------------- ASP.Net+Unity開發、.Net培訓、期待與您交流! ----------------------

以下介紹一下單例設計模式:
單例,即單個例項物件。那麼單例設計模式:即解決一個類在記憶體中只存在一個物件。
那麼想要保證物件唯一:
    1,為了避免其他程式過多建立該類物件,先禁止其他程式建立該類物件。
    2,還為了其他程式可以訪問到該類物件,只好在本類中,自定義一個物件。
    3,為了方便其他程式對自定義物件的訪問,可以對外提供一些訪問方式。
那麼如何用程式碼來實現上述思路呢?
    1,禁止其他程式建立該類物件,即將建構函式私有化即可。
    2,在類中建立一個本類物件。
    3,為了使其他物件訪問到該自定義物件,可以提供一個方法獲取到該物件。
程式碼實現主要有兩種方式:餓漢式,懶漢式。
餓漢式:即先初始化物件。
餓漢式程式碼實現如下:
class Single
{
  private Single(){} //將建構函式私有化
  static Single s = new Single();  //在本類中自定義一個物件,該s要被靜態方法訪問到,所以要用static修飾
  public static Single getInstance(){//對外提供一個方法,可以獲取物件,
        return s; //另外,不能建立物件,所以必須用類名呼叫,所以要用static修飾
        }
  }
class SingleDemo
{
    public static void main(String[] args)
  {
        Single ss = Single.getInstance;//這樣建立的物件都是同一個物件了。
    }
  }
     懶漢式:即物件是方法被呼叫時,才初始化,也叫做物件的延時載入。在這裡,指的是,single類進記憶體,          
物件還沒有存在,只有呼叫了getInstance 方法時,才建立物件。
     懶漢式程式碼實現如下:
  class Single
  {
    private Single(){}
    private static Single s = null;//這裡暫時先不建立物件。
    public static Single getInstance()
    {
      if(s==null){
              B-->進來。所以建立的就不是同一個物件了,會出現安全隱患。
              A-->可能等在這。
          s = new Single();
      }
      return s;
    }
  }
但是注意,懶漢式中容易出現安全隱患,所以可以在方法中加一個鎖,即synchronized.
即public static synchronized Single getInstance();
然而,加上一個鎖之後,程式就變得低效率了。那麼應該怎麼辦呢?
可以進行雙重判斷。
public static Single getInstance()
{
if (s==null){
      synchronized (Single.class)//靜態函式所使用的鎖是所在類的位元組碼檔案物件,即類名.class
      {
            if(s==null){
              s= new Single();
            }
        }
  }
}
這樣既可以保證不會出現安全隱患,也保證了效率。但是程式碼有點複雜。
所以,在實際開發過程中,主要還是用餓漢式單例設計模式。


                         ----------------ASP.Net+Unity開發、.Net培訓、期待與您交流! --------------
                         詳情請檢視:www.itheima.com