程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java設計模式之singleton單例設計模式

Java設計模式之singleton單例設計模式

編輯:關於JAVA
 

現在網上到處是單例設計模式,都開玩笑說現在滿城盡是singleton,呵呵,我也拿出來了,因為我平時用到最多的就是單例設計模式吧,而且比較簡單,可以作為Java設計模式的入門篇吧。

SINGLETON—俺有6個漂亮的老婆,她們的老公都是我,我就是我們家裡的老公Sigleton,她們只要說道“老公”,都是指的同一個 人,那就是我(剛才做了個夢啦,哪有這麼好的事)

單例模式:單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例單例模式。單例模式只應在有真正的 “單一實例”的需求時才可使用。’‘————————–先引用下“從追MM談Java的23種設計模式”文章中的說法。

單例設計模式形式有4種,一般人只知道有兩種,懶漢式和餓漢式。
懶漢式(只有需要的時候才new出來,這裡要用synchronized方法或代碼塊同步,因為在多線程情況下,不同的人同時進來拿到的引用可能都是null,結果都去new了)
public class LazzSingleton{
private LazzSingleton lazzSingleton = null;
private LazzSingleton() {}//私有構造期 這個很重要啦,如果共有那麼外面就可以隨便new了,那麼我們寫這個單例意義就不大了,我發現公司老員工都寫public的了,大家要注意下!

public synchronized LazzSingleton getInstance(){
if(lazzSingleton==null){
lazzSingleton = new LazzSingleton ();
return lazzSingleton ;
}
return null;
}

}

用的時候就:LazzSingleton lazzSingleton = LazzSingleton.getInstance();

餓漢式(一來就new,拿的時候直接拿對象)
public class HungerSingleton{
private HungerSingleton hungerSingleton = new HungerSingleton ();
private HungerSingleton() {}//私有構造期
public HungerSingleton getInstance(){
return hungerSingleton ;
}
}

用的時候就:HungerSingleton singleton = HungerSingleton.getInstance();

還有一種和餓漢式差不多(Effective Java這本書中有),因為式靜態常量,當然內存中只有一個對象啦。
public class StaticFinalSingleton(){
public static final StaticFinalSingleton singleton= new StaticFinalSingleton();

private StaticFinalSingleton (){};//私有構造期
}

用的時候就:StaticFinalSingleton staticFinalSingleton = StaticFinalSingleton.staticFinalSingleton ;

最後一種我記不起來了,用的不多。(我有個壞習慣,嗯,比喜歡記筆記,而且記性不好,希望大家不要學我)

所以實現單例要點:1.私有化構造器(外部不能new),2.用對象名去引用屬性(第三種)或靜態方法(第一第二種);

應用場景(單例設計模式一般和工廠設計模式聯合起來用,等做factory工廠模式時再一起使用,很簡單)
如果你的系統中有要讀配置文件,那麼讀配置文件的類就可以用單例設計模式了。例子:
public class LoadProperties {
private static LoadProperties loadProperties = new LoadProperties();
private LoadProperties(){};

public static LoadPropertiesgetInstance(){
return loadProperties
}
/**
* 根據文件名、模塊名,從配置文件中取得菜單名
* @param model
* @param fileName
* @return
*/
public String[] getMenus(String model,String fileName){
//….
return null;
}
/**
* 根據文件名,讀取顯示風格
* @param fileName
* @return
*/
public String[] getStyle(String fileName){
//……
return null;
}

}
/**
* 根據文件名,用戶名,讀取用戶權限,<p>先判斷用戶級別,然後讀取其權限</p>
* @param fileName
* @param user
*/

public String[] getPrivileges(String filename,String username){

    return null;

}

//……
}

接下來我們來做個實驗,檢驗到底是不是singleton單例,單線程下我們一眼就看的出來是,所以我們就在多線程下測試。
package org.javaer.code.pattern;

public class Singleton {
static LazzSingleton lazzSingleton1, lazzSingleton2;
static HungerSingleton hungerSingleton1, hungerSingleton2;
static StaticFinalSingleton staticFinalSingleton1, staticFinalSingleton2;

public static void main(String[] args) {

while (1 > 0) {
new Runnable() {
public void run() {
lazzSingleton1 = LazzSingleton.getInstance();  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved