欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

全面解析Java設(shè)計(jì)模式之單例模式

 更新時(shí)間:2017年12月21日 16:57:05   作者:天陰的時(shí)候  
這篇文章主要幫助大家全面解析Java設(shè)計(jì)模式之單例模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Java設(shè)計(jì)模式之單例模式的具體代碼,供大家參考,具體內(nèi)容如下

概念:

單例模式:一個(gè)類中只有一個(gè)實(shí)例。

一個(gè)類有且僅有一個(gè)實(shí)例,并且提供了一個(gè)全局的訪問(wèn)點(diǎn)。

使用該模式的起因:

  當(dāng)我們?cè)跒g覽網(wǎng)站時(shí),有些網(wǎng)站會(huì)顯示“當(dāng)前在線人數(shù)”。通常,實(shí)現(xiàn)這個(gè)功能的辦法是將登陸的每一個(gè)IP存儲(chǔ)在一個(gè)內(nèi)存、文件或者數(shù)據(jù)庫(kù)中,每多一個(gè)IP,就實(shí)現(xiàn)“+1”。一般就是用一個(gè)方法,比如add(),實(shí)現(xiàn)“+1”的功能,比如用“update”語(yǔ)句,先獲取數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù),再+1,更新數(shù)據(jù)庫(kù)中的數(shù)據(jù),,然后保存;顯示在頁(yè)面時(shí),再通過(guò)另外的方法獲取數(shù)據(jù)庫(kù)中的數(shù)據(jù)即可。但是,當(dāng)多個(gè)用戶同時(shí)登陸時(shí),如果每一個(gè)都要new一個(gè)對(duì)象,然后再通過(guò)“對(duì)象.方法名”調(diào)用執(zhí)行add()方法,再將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中,這樣就會(huì)導(dǎo)致多個(gè)用戶無(wú)法將實(shí)際的用戶數(shù)據(jù)準(zhǔn)確的記錄到數(shù)據(jù)庫(kù)中。所以,把這個(gè)計(jì)數(shù)器設(shè)計(jì)為一個(gè)全局對(duì)象(所有人都使用這一個(gè)對(duì)象,而不是用一個(gè),new一個(gè)),所有人都共用同一份數(shù)據(jù),就可以避免類似的問(wèn)題,這就是我們所說(shuō)的單例模式的其中的一種應(yīng)用。 

同樣的,還有其他場(chǎng)景中,也會(huì)遇到相似的情景,使用到類似的思路。比如:

   1.外部資源:每臺(tái)計(jì)算機(jī)有若干個(gè)打印機(jī),但只能有一個(gè)PrinterSpooler,以避免兩個(gè)打印作業(yè)同時(shí)輸出到打印機(jī)。內(nèi)部資源:大多數(shù)軟件都有一個(gè)(或多個(gè))屬性文件存放系統(tǒng)配置,這樣的系統(tǒng)應(yīng)該有一個(gè)對(duì)象管理這些屬性文件
   2. Windows的Task Manager(任務(wù)管理器)就是很典型的單例模式(這個(gè)很熟悉吧),想想看,是不是呢,你能打開(kāi)兩個(gè)windows task manager嗎? 不信你自己試試看哦~
   3. windows的Recycle Bin(回收站)也是典型的單例應(yīng)用。在整個(gè)系統(tǒng)運(yùn)行過(guò)程中,回收站一直維護(hù)著僅有的一個(gè)實(shí)例。
   4. 網(wǎng)站的計(jì)數(shù)器,一般也是采用單例模式實(shí)現(xiàn),否則難以同步。
   5. 應(yīng)用程序的日志應(yīng)用,一般都何用單例模式實(shí)現(xiàn),這一般是由于共享的日志文件一直處于打開(kāi)狀態(tài),因?yàn)橹荒苡幸粋€(gè)實(shí)例去操作,否則內(nèi)容不好追加。
   6. Web應(yīng)用的配置對(duì)象的讀取,一般也應(yīng)用單例模式,這個(gè)是由于配置文件是共享的資源。
   7. 數(shù)據(jù)庫(kù)連接池的設(shè)計(jì)一般也是采用單例模式,因?yàn)閿?shù)據(jù)庫(kù)連接是一種數(shù)據(jù)庫(kù)資源。數(shù)據(jù)庫(kù)軟件系統(tǒng)中使用數(shù)據(jù)庫(kù)連接池,主要是節(jié)省打開(kāi)或者關(guān)閉數(shù)據(jù)庫(kù)連接所引起的效率損耗,這種效率上的損耗還是非常昂貴的,因?yàn)楹斡脝卫J絹?lái)維護(hù),就可以大大降低這種損耗。
   8. 多線程的線程池的設(shè)計(jì)一般也是采用單例模式,這是由于線程池要方便對(duì)池中的線程進(jìn)行控制。
   9. 操作系統(tǒng)的文件系統(tǒng),也是大的單例模式實(shí)現(xiàn)的具體例子,一個(gè)操作系統(tǒng)只能有一個(gè)文件系統(tǒng)。
   10. HttpApplication 也是單位例的典型應(yīng)用。熟悉ASP.Net(IIS)的整個(gè)請(qǐng)求生命周期的人應(yīng)該知道HttpApplication也是單例模式,所有的HttpModule都共享一個(gè)HttpApplication實(shí)例。 

總結(jié)起來(lái),單例模式的一般應(yīng)用場(chǎng)景為:

    1.需要頻繁實(shí)例化然后銷毀的對(duì)象。

    2.創(chuàng)建對(duì)象時(shí)耗時(shí)過(guò)多或者耗資源過(guò)多,但又經(jīng)常用到的對(duì)象。

      3.有狀態(tài)的工具類對(duì)象。

    4.頻繁訪問(wèn)數(shù)據(jù)庫(kù)或者文件的對(duì)象。

    5.資源共享的情況下,避免由于資源操作時(shí)導(dǎo)致的性能或損耗等。如上述中的日志文件、應(yīng)用配置等。

    6.控制資源的情況下,方便資源之間的互相通信。如線程池等。

特點(diǎn):

1、單例類只能有一個(gè)實(shí)例;

2、單例類必須自己創(chuàng)建自己的唯一實(shí)例;

3、單例類必須給所有其他對(duì)象提供這一實(shí)例

單例模式要素: 

   1.私有構(gòu)造方法
   2.私有靜態(tài)引用指向自己實(shí)例
   3.以自己實(shí)例為返回值的公有靜態(tài)方法 

實(shí)現(xiàn)單例模式的三種方法:

1.餓漢式:?jiǎn)卫龑?shí)例在類裝載時(shí)就構(gòu)建,急切初始化。(預(yù)先加載法)

/**
* 餓漢式(推薦)
*
*/
public class Test {
    private Test() {
    }
    public static Test instance = new Test();
    public Test getInstance() {
        return instance;
    }
}

優(yōu)點(diǎn) 

    1.線程安全
    2.在類加載的同時(shí)已經(jīng)創(chuàng)建好一個(gè)靜態(tài)對(duì)象,調(diào)用時(shí)反應(yīng)速度快

缺點(diǎn) 

    資源效率不高,可能getInstance()永遠(yuǎn)不會(huì)執(zhí)行到,但執(zhí)行該類的其他靜態(tài)方法或者加載了該類(class.forName),那么這個(gè)實(shí)例仍然初始化

2.懶漢式:?jiǎn)卫龑?shí)例在第一次被使用時(shí)構(gòu)建,延遲初始化。

class Test {
    private Test() {
    }
    public static Test instance = null;
    public static Test getInstance() {
        if (instance == null) {
       //多個(gè)線程判斷instance都為null時(shí),在執(zhí)行new操作時(shí)多線程會(huì)出現(xiàn)重復(fù)情況
            instance = new Singleton2();
        }
        return instance;
    }
}

優(yōu)點(diǎn) 

    避免了餓漢式的那種在沒(méi)有用到的情況下創(chuàng)建事例,資源利用率高,不執(zhí)行g(shù)etInstance()就不會(huì)被實(shí)例,可以執(zhí)行該類的其他靜態(tài)方法。

缺點(diǎn) 

    懶漢式在單個(gè)線程中沒(méi)有問(wèn)題,但多個(gè)線程同事訪問(wèn)的時(shí)候就可能同事創(chuàng)建多個(gè)實(shí)例,而且這多個(gè)實(shí)例不是同一個(gè)對(duì)象,雖然后面創(chuàng)建的實(shí)例會(huì)覆蓋先創(chuàng)建的實(shí)例,但是還是會(huì)存在拿到不同對(duì)象的情況。解決這個(gè)問(wèn)題的辦法就是加鎖synchonized,第一次加載時(shí)不夠快,多線程使用不必要的同步開(kāi)銷大。

3.雙重檢測(cè)

class Test {
    private Test() {
    }
    public static Test instance = null;

    public static Test getInstance() {
        if (instance == null) {
            synchronized (Test.class) {
                if (instance == null) {
                    instance = new Test();
                }
            }
        }
        return instance;
    }
}

優(yōu)點(diǎn) 

    資源利用率高,不執(zhí)行g(shù)etInstance()就不被實(shí)例,可以執(zhí)行該類其他靜態(tài)方法

缺點(diǎn) 

    第一次加載時(shí)反應(yīng)不快,由于java內(nèi)存模型一些原因偶爾失敗

4.靜態(tài)內(nèi)部類

class Test {
    private Test() {
    }

    private static class SingletonHelp {
        static Test instance = new Test();
    }

    public static Test getInstance() {
        return SingletonHelp.instance;
    }
}

優(yōu)點(diǎn) 

    資源利用率高,不執(zhí)行g(shù)etInstance()不被實(shí)例,可以執(zhí)行該類其他靜態(tài)方法

缺點(diǎn) 

    第一次加載時(shí)反應(yīng)不夠快

總結(jié): 

    一般采用餓漢式,若對(duì)資源十分在意可以采用靜態(tài)內(nèi)部類,不建議采用懶漢式及雙重檢測(cè)

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

相關(guān)文章

  • SpringBoot中的自動(dòng)裝配原理解析

    SpringBoot中的自動(dòng)裝配原理解析

    這篇文章主要介紹了SpringBoot中的自動(dòng)裝配原理解析,自動(dòng)裝配就是指 Spring 容器在不使用<constructor-arg>和<property>標(biāo)簽的情況下,可以自動(dòng)裝配(autowire)相互協(xié)作的Bean之間的關(guān)聯(lián)關(guān)系,將一個(gè) Bean注入其他Bean的Property中,需要的朋友可以參考下
    2023-08-08
  • Netty學(xué)習(xí)之理解selector原理示例

    Netty學(xué)習(xí)之理解selector原理示例

    這篇文章主要為大家介紹了Netty學(xué)習(xí)之理解selector原理示例使用分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2023-07-07
  • SpringBoot自定義注解解決公共字段填充問(wèn)題解決

    SpringBoot自定義注解解決公共字段填充問(wèn)題解決

    修改時(shí)間,修改人等字段時(shí),這些字段屬于公共字段,本文主要介紹了SpringBoot自定義注解解決公共字段填充問(wèn)題解決,使用它的好處就是可以統(tǒng)一對(duì)這些字段進(jìn)行處理,感興趣的可以了解一下
    2024-07-07
  • MyBatis查詢返回Map示例代碼

    MyBatis查詢返回Map示例代碼

    這篇文章主要給大家介紹了關(guān)于MyBatis查詢返回Map的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • Spring的@Bean和@Autowired組合使用詳解

    Spring的@Bean和@Autowired組合使用詳解

    這篇文章主要介紹了Spring的@Bean和@Autowired組合使用詳解,Spring的@Bean注解用于告訴方法,產(chǎn)生一個(gè)Bean對(duì)象,然后這個(gè)Bean對(duì)象交給Spring管理,產(chǎn)生這個(gè)Bean對(duì)象的方法Spring只會(huì)調(diào)用一次隨后會(huì)將這個(gè)Bean對(duì)象放在自己的IOC容器,需要的朋友可以參考下
    2024-01-01
  • spring-cloud入門(mén)之eureka-server(服務(wù)發(fā)現(xiàn))

    spring-cloud入門(mén)之eureka-server(服務(wù)發(fā)現(xiàn))

    本篇文章主要介紹了spring-cloud入門(mén)之eureka-server(服務(wù)發(fā)現(xiàn)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • java源碼解析之String類的compareTo(String otherString)方法

    java源碼解析之String類的compareTo(String otherString)方法

    這篇文章主要給大家介紹了關(guān)于java源碼解析之String類的compareTo(String otherString)方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • Gradle構(gòu)建基本的Web項(xiàng)目結(jié)構(gòu)

    Gradle構(gòu)建基本的Web項(xiàng)目結(jié)構(gòu)

    這篇文章主要為大家介紹了Gradle創(chuàng)建Web項(xiàng)目基本的框架結(jié)構(gòu)搭建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • 關(guān)于SpringBoot簡(jiǎn)介、官網(wǎng)構(gòu)建、快速啟動(dòng)的問(wèn)題

    關(guān)于SpringBoot簡(jiǎn)介、官網(wǎng)構(gòu)建、快速啟動(dòng)的問(wèn)題

    SpringBoot 是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化Spring應(yīng)用的初始搭建以及開(kāi)發(fā)過(guò)程,這篇文章主要介紹了SpringBoot簡(jiǎn)介、官網(wǎng)構(gòu)建、快速啟動(dòng),需要的朋友可以參考下
    2022-07-07
  • Spring中的@Transactional注解使用詳解

    Spring中的@Transactional注解使用詳解

    這篇文章主要介紹了Spring中的@Transactional注解使用詳解,@Transactional 是一個(gè)注解,用于在 Spring 框架中管理事務(wù)的聲明式事務(wù)管理機(jī)制,它可以應(yīng)用于方法或類級(jí)別,并指示方法或類在執(zhí)行時(shí)應(yīng)該被包裝在一個(gè)事務(wù)中,需要的朋友可以參考下
    2024-01-01

最新評(píng)論