設計模式--單例模式


什么是設計模式

設計模式(Design pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問,設計模式於己於他人於系統都是多贏的;設計模式使代碼編制真正工程化;設計模式是軟件工程的基石脈絡,如同大廈的結構一樣。

設計模式分類

設計模式分為三種類型,共23種

  • 創建型模式:單例模式、抽象工廠模式、建造者模式、工廠模式、原型模式。
  • 結構型模式:適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式。
  • 行為型模式:模版方法模式、命令模式、迭代器模式、觀察者模式、中介者模式、備忘錄模式、解釋器模式、狀態模式、策略模式、職責鏈模式、訪問者模式。

單例模式

單例模式是最簡單的設計模式之一,保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。

適用性

  • 當類只能有一個實例而且客戶可以從一個眾所周知的訪問點訪問它時。
  • 當這個唯一實例應該是通過子類化可擴展的,並且客戶應該無需更改代碼就能使用一個擴展的實例時。

例如:

配置文件、工具類、線程池、緩存、日志對象等

如果以上這些對象創造出多個實例,就會導致許多問題, 比如占用過多資源,不一致的結果等。那么如何保證整個應用中某個實例有且只有一個呢?這里我們就可以通過 單例模式來實現了。

單例模式種類

常見的單例模式分為如下兩類:

  • 懶漢模式(線程不安全的)
  • 餓漢模式(線程安全的)

懶漢模式

class InstanceDemo2
{
    public static void main(String[] args){
        懶漢 懶=懶漢.getInstance();
        懶漢 漢=懶漢.getInstance();
        if(懶==漢){
            System.out.println("是同一個實例");
        }else{
            System.out.println("不是同一個實例");
        }
        
    }
}


//懶漢模式
class 懶漢{
    //1,將構造方法私有化,不允許外部直接創建對象
    private 懶漢(){}
    //2,聲明類的唯一實例,使用private static 修飾
    private static 懶漢 lazy; //默認值為null
    //定義getInstance
    public static 懶漢 getInstance(){
        if(lazy==null){
            lazy=new 懶漢();
        }
        return lazy;
    }
}

餓漢模式

class InstanceDemo
{
    public static void main(String[] args){
        餓漢 餓=餓漢.getInstance();
        餓漢 漢=餓漢.getInstance();
        if(餓==漢){
            System.out.println("是同一個實例");
        }else{
            System.out.println("不是同一個實例");
        }
    }
}

class 餓漢{
    //1.限制外界不能隨意的new對象
    private  餓漢(){}  
    //在類內部造對象,然后在將對象送出去
    //2.創建對象
    private static  final 餓漢 h=new 餓漢();
    //3.提供一個用於獲實例的方法, 使用public static修飾
    public static 餓漢 getInstance(){
        return h;
    }
}

兩種模式的區別

餓漢模式的特點是加載類是比較慢,但是運行時獲取對象的速度比較快,線程安全,懶漢模式的特點是加載類是比較快,但是運行獲取對象的速度比較慢,線程不安全

如以上文章或鏈接對你有幫助的話,別忘了在文章結尾處輕輕點擊一下 “還不錯”按鈕或到頁面右下角點擊 “贊一個” 按鈕哦。你也可以點擊頁面右邊“分享”懸浮按鈕哦,讓更多的人閱讀這篇文章。

作者: Li-Cheng
由於本人水平有限,文章在表述和代碼方面如有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論哦。你也可以關注我,一起學習哦!

(^_^)如果您覺得此文對您有幫助,打個賞喝個咖啡(^_^)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM