最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java單例模式簡單介紹

 更新時間:2017年10月11日 14:46:55   作者:夜孤寒  
這篇文章主要為大家詳細介紹了Java單例模式簡單的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、概念

單例模式是一種常用的軟件設(shè)計模式。在它的核心結(jié)構(gòu)中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統(tǒng)中一個類只有一個實例而且該實例易于外界訪問,從而方便對實例個數(shù)的控制并節(jié)約系統(tǒng)資源。如果希望在系統(tǒng)中某個類的對象只能存在一個,單例模式是最好的解決方案。就筆者認為,單例就是不讓外界創(chuàng)建對象。

1.1概念剖析

對于單例的話,從上面的概念剖析,應(yīng)該滿足下面的幾個條件:

第一:單例類中只能有一個單例對象;

第二:單例類必須自己創(chuàng)建自己的唯一實例對象;

第三:這個實例對象能夠給外界訪問到,并且外界不能夠自己創(chuàng)建對象。

二、常見幾種單例模式的方式

在java中,對于單例模式一般來說,分為懶漢式,餓漢式,以及登記式,但是登記式一般較少看到,所以也容易忽略。筆者若非今天突然想總結(jié)一下,在網(wǎng)上查找資料,也不會注意到這個。下面按照這種方式來貼出代碼,并進行解釋。

2.1餓漢式單例類

package com.ygh.singleton;
/**
 * 餓漢式單例類
 * @author 夜孤寒
 * @version 1.1.1
 */
public class HungerSingleton {
  //將構(gòu)造方法私有,外界類不能使用構(gòu)造方法new對象
  private HungerSingleton(){}
  //創(chuàng)建一個對象
  private static final HungerSingleton lazySinleton=new HungerSingleton();
  //設(shè)置實例獲取方法,返回實例給調(diào)用者
  public static HungerSingleton getInstance(){
    return lazySinleton;
  }
}

寫一個測試類,測試是不是實現(xiàn)單例:

package com.ygh.singleton;
/**
 * 測試單例類
 * 
 * @author 夜孤寒
 * @version 1.1.1
 */
public class Test {
  public static void main(String[] args) {
    /*
     * 構(gòu)造方法私有化,不能夠使用下面方式new對象
     */
    //HungerSingleton hungerSingleton=new HungerSingleton();
    //使用實例獲取方法來獲取對象
    HungerSingleton h1=HungerSingleton.getInstance();
    HungerSingleton h2=HungerSingleton.getInstance();
    System.out.println(h1==h2);//true
  }
}

從上面可以看出:這個測試類的兩個引用是相等的,也就是說兩個引用指向的是同一個對象,而這也正好符合單例模式標(biāo)準(zhǔn)。到這里,餓漢式介紹結(jié)束。

2.2餓漢式單例類

package com.ygh.singleton;
/**
 * 懶漢式單例類
 * @author 夜孤寒
 * @version 1.1.1
 */
public class LazySingleton {
  //將構(gòu)造方法私有,外界類不能使用構(gòu)造方法new對象
  private LazySingleton(){}
  //創(chuàng)建一個對象,不為final
  private static LazySingleton lazySingleton=null;
  //設(shè)置實例獲取方法,返回實例給調(diào)用者
  public static LazySingleton getInstance(){
    //當(dāng)單例對象不存在,創(chuàng)建
    if(lazySingleton==null){
      lazySingleton=new LazySingleton();
    }
    //返回
    return lazySingleton;
  }
}

測試類:

package com.ygh.singleton;
/**
 * 測試單例類
 * 
 * @author 夜孤寒
 * @version 1.1.1
 */
public class Test {
  public static void main(String[] args) {
    /*
     * 構(gòu)造方法私有化,不能夠使用下面方式new對象
     */
    //LazySingleton lazySingleton=new LazySingleton();
    //使用實例獲取方法來獲取對象
    LazySingleton l1=LazySingleton.getInstance();
    LazySingleton l2=LazySingleton.getInstance();
    System.out.println(l1==l2);//true
  }
}

從上面可以看出:這個測試類的兩個引用是相等的,也就是說兩個引用指向的是同一個對象,而這也正好符合單例模式標(biāo)準(zhǔn)。到這里,懶漢式介紹結(jié)束。

2.3懶漢式和餓漢式的區(qū)別

懶漢式是當(dāng)沒有對象的時候,就會創(chuàng)建一個單例對象,當(dāng)有對象的時候,就不會再創(chuàng)建對象,這個說起來可能不是那么容易理解,但是讀者如果有興趣了解更深,可以在eclipse中使用斷點來測試,將LazySingleton類的if花括號內(nèi)的內(nèi)容加上斷點,然后在Test類中,使用debug運行,這樣子就能夠很容易體現(xiàn)出來,第一次創(chuàng)建了一個對象,但是第二次沒有創(chuàng)建對象。

餓漢式則是實現(xiàn)就用final這個關(guān)鍵字將對象創(chuàng)建好了,當(dāng)調(diào)用者需要實例對象的時候,就可以通過getInstance這個方法獲取創(chuàng)建好的實例。

2.4登記式單例類

對于登記式單例類,筆者也不是很熟悉,貼了一段網(wǎng)絡(luò)上的代碼以供自己學(xué)習(xí)參考,請讀者自行學(xué)習(xí)。

import java.util.HashMap;
import java.util.Map;

/**
 * 登記式單例類
 * @author Administrator
 *
 */
public class RegisterSingleton {
 private static Map<String, RegisterSingleton> map = new HashMap<String, RegisterSingleton>();
 static {
  RegisterSingleton single = new RegisterSingleton();
  map.put(single.getClass().getName(), single);
 }

 /*
  * 保護的默認構(gòu)造方法
  */
 protected RegisterSingleton() {
 }

 /*
  * 靜態(tài)工廠方法,返還此類惟一的實例
  */
 public static RegisterSingleton getInstance(String name) {
  if (name == null) {
   name = RegisterSingleton.class.getName();
   System.out.println("name == null" + "--->name=" + name);
  }
  if (map.get(name) == null) {
   try {
    map.put(name, (RegisterSingleton) Class.forName(name).newInstance());
   } catch (InstantiationException e) {
    e.printStackTrace();
   } catch (IllegalAccessException e) {
    e.printStackTrace();
   } catch (ClassNotFoundException e) {
    e.printStackTrace();
   }
  }
  return map.get(name);
 }

 /*
  * 一個示意性的商業(yè)方法
  */
 public String about() {
  return "Hello, I am RegSingleton.";
 }

 public static void main(String[] args) {
  RegisterSingleton single3 = RegisterSingleton.getInstance(null);
  System.out.println(single3.about());
 }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • pageHelper分頁失效問題及解決方案

    pageHelper分頁失效問題及解決方案

    文章介紹了Mybatis分頁插件pageHelper的一個bug,即在一對多查詢時會出現(xiàn)分頁錯誤,作者提供了解決方案,包括方案一、方案二和方案三,方案一通過在服務(wù)層進行額外查詢來解決分頁問題,方案二利用mybatis的嵌套子查詢來解決,但可能產(chǎn)生'1+N'問題
    2025-01-01
  • 聊聊@Autowired注解注入,寫接口名字還是實現(xiàn)類的名字

    聊聊@Autowired注解注入,寫接口名字還是實現(xiàn)類的名字

    這篇文章主要介紹了聊聊@Autowired注解注入,寫接口名字還是實現(xiàn)類的名字,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring AOP攔截-三種方式實現(xiàn)自動代理詳解

    Spring AOP攔截-三種方式實現(xiàn)自動代理詳解

    這篇文章主要介紹了Spring AOP攔截-三種方式實現(xiàn)自動代理詳解,還是比較不錯的,這里分享給大家,供需要的朋友參考。
    2017-11-11
  • SpringBoot實現(xiàn)熱部署的三種方式

    SpringBoot實現(xiàn)熱部署的三種方式

    本文主要介紹了SpringBoot實現(xiàn)熱部署的三種方式,主要包括配置pom.xml文件,使用插件的執(zhí)行命令mvn spring-boot:run啟動項,使用springloader本地啟動修改jvm參數(shù),使用devtools工具包,感興趣的可以了解一下
    2023-12-12
  • MyBatis中關(guān)于SQL的寫法總結(jié)

    MyBatis中關(guān)于SQL的寫法總結(jié)

    這篇文章主要介紹了MyBatis中關(guān)于SQL的寫法總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • mybatis攔截器實現(xiàn)通用權(quán)限字段添加的方法

    mybatis攔截器實現(xiàn)通用權(quán)限字段添加的方法

    這篇文章主要給大家介紹了關(guān)于mybatis攔截器實現(xiàn)通用權(quán)限字段添加的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用mybatis具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java常見延遲隊列的實現(xiàn)方案總結(jié)

    Java常見延遲隊列的實現(xiàn)方案總結(jié)

    Java延遲隊列(DelayQueue)是Java并發(fā)包中的一個類,它實現(xiàn)了BlockingQueue接口,且其中的元素必須實現(xiàn)Delayed接口,延遲隊列中的元素按照延遲時間的長短進行排序,本文給大家介紹了Java常見延遲隊列的實現(xiàn)方案總結(jié),需要的朋友可以參考下
    2024-03-03
  • 代理模式之Java動態(tài)代理實現(xiàn)方法

    代理模式之Java動態(tài)代理實現(xiàn)方法

    今天一個偶然的機會我突然想看看JDK的動態(tài)代理,因為以前也知道一點,而且只是簡單的想測試一下使用,使用很快里就寫好了這么幾個接口和類,需要的朋友可以參考下
    2012-11-11
  • Java編程Commons lang組件簡介

    Java編程Commons lang組件簡介

    這篇文章主要介紹了Java編程Commons lang組件的相關(guān)內(nèi)容,十分具有參考意義,需要的朋友可以了解下。
    2017-09-09
  • Java向上向下轉(zhuǎn)型詳解

    Java向上向下轉(zhuǎn)型詳解

    這篇文章主要為大家詳細介紹了Java向上向下轉(zhuǎn)型,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09

最新評論

岗巴县| 邵武市| 韶山市| 平安县| 专栏| 元阳县| 安宁市| 海门市| 同德县| 莱西市| 黔南| 沈丘县| 商南县| 龙南县| 井陉县| 全州县| 秦安县| 嘉祥县| 吉安市| 清流县| 江口县| 巴林左旗| 都昌县| 庄浪县| 靖边县| 偏关县| 浦东新区| 锡林郭勒盟| 浦东新区| 仪征市| 龙海市| 福清市| 鞍山市| 安泽县| 华宁县| 府谷县| 东台市| 思南县| 张家港市| 米易县| 托克托县|