1. 程式人生 > >單例模式(Singleton Pattern):簡單&粗暴解析

單例模式(Singleton Pattern):簡單&粗暴解析

1.前言


2.目錄

單例目錄.png


3.含義

建立一個唯一的例項。


4.解決

1.全域性公用資源的共享
2.一個全域性使用的類頻繁地建立與銷燬


5.原理

5.1 例子(印表機)

  • 有一臺印表機,有3個人需要列印,第一個人在列印時,需要先把印表機接上電源再列印,然後其他人列印時,就可以直接列印不需再次接收電源。
    示例圖

5.2 結合例子

  • 類比圖
    示意圖
  • 例項
// 單例
public class Singleton {
    public static volatile Singleton Singleton3;
    public static Singleton getInstance3(){
        if(Singleton3==null){
            synchronized (Singleton.class){
                if(Singleton3==null){
                    //開機
                    Singleton3 =
new Singleton(); } } } return Singleton3; } public void print(String text){ // 列印 } } // 呼叫 Singleton.getInstance3().print("列印任務A"); Singleton.getInstance3().print("列印任務B"); Singleton.getInstance3().print("列印任務C");

6.優點

1.提供了對唯一例項的受控訪問,同時只能處理一個訪問。
2.節約系統資源。


7.缺點

1.沒有抽象層,難擴充套件。
2.單例類的職責過重,在一定程度上違背了“單一職責原則”。


8.六種使用方式

8.1 餓漢式:執行緒安全,類載入時就初始化,浪費記憶體

public static Singleton Singleton = new Singleton();
    public static Singleton getIntance(){
        return Singleton;
    }

8.2 懶漢式:執行緒不安全,懶載入

public static Singleton Singleton1;
    public static Singleton getInstance1(){
        if(Singleton1==null){
            Singleton1 = new Singleton();
        }
        return Singleton1;
    }

8.3 懶漢式:執行緒安全,懶載入 ,效率低

public static Singleton Singleton2;
    public static synchronized Singleton getInstance2(){
        if(Singleton2==null){
            Singleton2 = new Singleton();
        }
        return Singleton2;
    }

8.4 雙檢鎖/雙重校驗鎖:執行緒安全,懶載入 ,效率高

    public static volatile Singleton Singleton3;
    public static Singleton getInstance3(){
        if(Singleton3==null){
            synchronized (Singleton.class){
                if(Singleton3==null){
                    Singleton3 = new Singleton();
                }
            }
        }
        return Singleton3;
    }

8.5 靜態內部類:執行緒安全,懶載入

    public static class SingletonInstance{
        public static final Singleton INSTANCEE = new Singleton();
    }
    public static Singleton getIntance4(){
        return SingletonInstance.INSTANCEE;
    }

8.6 列舉

    public enum SingletonEnum{
        INSTANCE;
        public void doSomething(){}
    }

9.總結

  • 到此, ‘單例模式’ 就解析完畢,,後續我會把上述 三大型別模式 下的各子模式進行解析分享,
    請繼續關注linhaojian_簡書
  • 如果喜歡我的分享,可以點選 關注 或者 ,你們支援是我分享的最大動力 。
  • linhaojian的Github

歡迎關注linhaojian_CSDN部落格或者linhaojian_簡書

不定期分享關於安卓開發的乾貨。

設計模式(Design pattern):簡單&粗暴解析
單例模式(Singleton Pattern):簡單&粗暴解析


寫技術文章初心

  • 技術知識積累
  • 技術知識鞏固
  • 技術知識分享
  • 技術知識交流