設計模式(五) 單例模式

2021-08-28 12:14:19 字數 1478 閱讀 9339

單例模式,主要由以下幾個模組組成:私有的靜態物件例項,私有的構造方法(避免外部呼叫new物件,保證只有乙個物件的例項),乙個共有的靜態獲取物件的方法(供外部呼叫)。

**如下:

懶漢式單例模式(在需要的時候,也即呼叫共有的靜態獲取物件的方法時才建立物件):

package singlepattern;

public class lazysingle

public static lazysingle getinstance()

return newinstance;

}}

懶漢式單例模式是執行緒不安全的(比如兩個執行緒同時執行getinstance方法,執行緒a執行到 newinstance = new lazysingle()的時候等待記憶體分配,此時執行緒b也執行到 if(newinstance == null),判斷返回是true,那麼程式中就可能出現兩個物件),可以做如下改進:

優化一(用synchronized):

package singlepattern;

public class lazysingle

public static synchronized lazysingle getinstance()

return newinstance;

}}

優化二(用synchronized,更加細粒度,即雙重檢驗):

package singlepattern;

public class lazysingle

public static lazysingle getinstance()}}

return newinstance;

}}

優化三(用靜態內部類,classloader機制在類載入的時候並不會載入靜態內部類,也就不會建立物件的例項,只有當呼叫獲取物件的方法時才會載入內部類,建立物件的例項):

package singlepattern;

public class lazysingle

private static class singleholder

public static final lazysingle getinstance()

}

餓漢式單例模式(不管需不需要物件例項,在類載入的時候就建立好類的例項,利用classloader機制避免了執行緒安全的問題):

package singlepattern;

public class hungrysingle

public static hungrysingle getinstance()

}

總結:一般情況下使用餓漢式單例模式,在特定的懶載入模式下(初始化很耗費資源,但是並不常用)可以使用靜態內部類的方式,其他情況下使用synchronized雙重檢驗的模式。

參考文件:設計模式|菜鳥教程,《設計模式之禪》

設計模式(五) 單件模式(單例模式)

三 單件模式的多執行緒安全問題 參考確保乙個類只有乙個例項,並提供乙個全域性訪問點。單件模式即單例模式。使用場景很多,比如多個程式都要使用乙個配置檔案中的資料,而且要實現資料共享和交換。必須要將多個資料封裝到乙個物件中,而且多個程式操作的是同乙個物件,也就是說必須保證這個配置檔案物件的唯一性。有兩種...

設計模式(五) 單例模式(Singleton)

單例模式是一種建立型的設計模式。單例模式意在保證乙個類僅有乙個例項,並且提供乙個全域性的訪問點。乙個國家只有乙個主席 乙個人只有乙個名字 身份證號,這些都是單例的例子。稍微實際點的例子就是,在某個伺服器程式中,將伺服器的配置資訊存放在乙個檔案中,這些配置資料有乙個單例物件統一讀取,然後服務程序中的其...

設計模式(五) 單例 多例模式

單例模式 singleton 保證類僅有乙個例項,並且提供乙個訪問它的全域性訪問點。多例模式 multitude pattern 負責建立 管理自己的多個例項,並且提供它們的全域性訪問點。單例模式 多例模式 不好的實現方法一 public class singleton else return si...