1. 程式人生 > >單例模式的五種實現方式

單例模式的五種實現方式

1、餓漢式(執行緒安全,呼叫效率高,但是不能延時載入):

public class ImageLoader{ 
     private static ImageLoader instance = new ImageLoader; 
     private ImageLoader(){} 
     public static ImageLoader getInstance(){  
          return instance;  
      } 
}

一上來就把單例物件創建出來了,要用的時候直接返回即可,這種可以說是單例模式中最簡單的一種實現方式。但是問題也比較明顯。單例在還沒有使用到的時候,初始化就已經完成了。也就是說,如果程式從頭到位都沒用使用這個單例的話,單例的物件還是會建立。這就造成了不必要的資源浪費。所以不推薦這種實現方式。

2.懶漢式(執行緒安全,呼叫效率不高,但是能延時載入):

public class SingletonDemo2 {
     
    //類初始化時,不初始化這個物件(延時載入,真正用的時候再建立)
    private static SingletonDemo2 instance;
     
    //構造器私有化
    private SingletonDemo2(){}
     
    //方法同步,呼叫效率低
    public static synchronized SingletonDemo2 getInstance(){
        if(instance==null){
            instance=new SingletonDemo2();
        }
        return instance;
    }
}

3.Double CheckLock實現單例:DCL也就是雙重鎖判斷機制(由於JVM底層模型原因,偶爾會出問題,不建議使用):

 public class SingletonDemo5 {
         private volatile static SingletonDemo5 SingletonDemo5;
  
         private SingletonDemo5() {
         }
  
         public static SingletonDemo5 newInstance() {
             if (SingletonDemo5 == null) {
                 synchronized (SingletonDemo5.class) {
                     if (SingletonDemo5 == null) {
                         SingletonDemo5 = new SingletonDemo5();
                     }
                 }
             }
             return SingletonDemo5;
         }
     }

4.靜態內部類實現模式(執行緒安全,呼叫效率高,可以延時載入)

public class SingletonDemo3 {
     
    private static class SingletonClassInstance{
        private static final SingletonDemo3 instance=new SingletonDemo3();
    }
     
    private SingletonDemo3(){}
     
    public static SingletonDemo3 getInstance(){
        return SingletonClassInstance.instance;
    }
     
}

5.列舉類(執行緒安全,呼叫效率高,不能延時載入,可以天然的防止反射和反序列化呼叫)

public enum SingletonDemo4 {
     
    //列舉元素本身就是單例
    INSTANCE;
     
    //新增自己需要的操作
    public void singletonOperation(){     
    }
}
如何選用:

-單例物件 佔用資源少,不需要延時載入,列舉 好於 餓漢

-單例物件 佔用資源多,需要延時載入,靜態內部類 好於 懶漢式

相關推薦

模式實現方式

size ron jdk null singleton bsp 還要 一個 fin 1、餓漢式:靜態常量 特點:單例的實例被聲明成static和final變量了,在第一次加載類到內存中時就會初始化,所以會創建實例本身是線程安全的 public class Sin

Java模式實現方式

開始 名稱 常量 就是 多線程開發 靜態代碼塊 浪費 ack 多線程同步 在平時的工作、學員的學習以及面試過程中,單例模式作為一種常用的設計模式,會經常被面試官問到,甚至筆試會要求學員現場默寫,下面將會就單例模式的實現思路和幾種常見的實現方式進行簡單的分享。

模式6實現方式

一:餓漢式public class MyObject { // 立即載入方式==餓漢模式 private static MyObject myObject = new MyObject();

模式——六實現方式(懶漢、餓漢、雙重檢驗鎖、靜態內部類、列舉)

單例模式 單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。這種模式涉及到一個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不

Android 模式實現方式及簡析

一.定義: 確保某一個類只有一個例項,而且自行例項並向整個系統提供這個例項 二.使用場景: 避免產生過多的物件消耗過多的資源,或者某種型別的物件只應該有且只有一個。例如,建立一個物件需要消耗的資源過多,如訪問資料庫或者IO 資源。 三.實現單例模式的關鍵

c#模式實現方式

    //單例模式一,本模式具有多執行緒不安全性,可通過多執行緒鎖來實現功能     public class Class1     {         //(1)將建構函式定義為private         private Class1()         {  

的三實現方式

In imp SQ span wrap 定制 bsp () import 一:類方法實現單例 class Mysql: __instance = None def __init__(self,host,port): self.ho

模式寫法

單例模式算是設計模式中最容易理解,也是最容易手寫程式碼的模式了吧。但是其中的坑卻不少,所以也常作為面試題來考。本文主要對幾種單例寫法的整理,並分析其優缺點。很多都是一些老生常談的問題,但如果你不知道如何建立一個執行緒安全的單例,不知道什麼是雙檢鎖,那這篇文章可能會幫助到你。 1、懶漢式(執

C++之智慧指標和普通指標模式實現

1  問題 實現c++的單例模式,這裡測試分別寫了通過智慧指標返回物件和普通返回指標     2  程式碼測試 include <iostream> #include <mutex> #include <m

的兩實現方式、多個版本及利弊對照

        單例設計模式,顧明思議,只有一個例項,先交代重要一點,為防止外界對該類進行例項化,需要把類的建構函式宣告為私有的,這樣大家對原理理解更深入些。 1、餓漢式 餓漢模式單例程式碼,經典,可用,無需改進。 package com.sing

模式建立方式

在建立單例模式的時候,如果單純的只考慮單例而不思考那樣做的話會產生什麼問題這樣是不嚴謹的,比如會發生執行緒安全問題,看了一些文章其中一篇寫得非常詳細有關單例模式的問題和效能比較,這篇文章http://blog.sina.com.cn/s/blog_62c7c3030100zw

高併發下最全執行緒安全的模式實現

為了節約系統資源,有時需要確保系統中某個類只有唯一一個例項,當這個唯一例項建立成功之後,我們無法再建立一個同類型的其他物件,所有的操作都只能基於這個唯一例項。 但是餓漢式單例類不能實現延遲載入,不管將來用不用始終佔據記憶體;懶漢式單例類執行緒安全控制煩瑣,而且效能受影響。可

python模式實現方法

1.方法1,程式執行過程中,某個類物件只有1個,該類物件的例項物件可以有無數個,根絕這點,讓類物件持有一個例項化物件,重寫類物件的__new__方法,始終返回持有的這個例項化物件,即可實現單例模式。 class Person1: _single = None

模式的多種實現方式

相對於第三種方式,這種方式是Singleton類被裝載了,instance不一定被初始化。因為SingletonHolder類沒有被主動使用,只有顯式通過呼叫getInstance方法時,才會顯式裝載SingletonHolder類,從而例項化instance。例如,如果例項化instance很消耗資源,我

Java 模式實現的差別

單例模式確保某個類只有一個例項,而且自行例項化並向整個系統提供這個例項。 思路是通過將該類的構造方法設為private,那麼在其他類中不能直接例項化該類。那麼為了得到該類的例項,需要有public的static方法來返回該類的例項。(之所以static是為了可以直接用

模式6實現及利弊分析

[TOC] # 單例模式6種實現及利弊分析 單例模式三要素 - **私有的構造方法;** - **指向自己例項的私有靜態引用;** - **以自己例項為返回值的靜態的公有方法** ## **1.餓漢式** ```java public class Singleton { private

模式實現方式

1、餓漢式(執行緒安全,呼叫效率高,但是不能延時載入):public class ImageLoader{ private static ImageLoader instance = new ImageLoader; private ImageLoad

模式實現方式及優缺點

> **公號:碼農充電站pro** > **主頁:** 當我們需要使得某個類只能有一個例項時,可以使用**單例模式**。 **單例模式**(*Singleton Design Pattern*)保證一個類只能有一個例項,並提供一個全域性訪問點。 單例模式的實現需要**三個必要的條件**: 1. 單例類

模式的C++實現

簡介         因為在設計或開發中,肯定會有這麼一種情況,一個類只能有一個物件被建立,如果有多個物件的話,可能會導致狀態的混亂和不一致。這種情況下,單例模式是最恰當的解決辦法。它有很多種實現方式,各自的特性不相同,使用的情形也不相同。今天要實現的是常用的三種,分別

模式寫法

遺憾 想象 develop 由於 tcl loader adr 希望 線程不安全 第一種(懶漢,線程不安全): Java代碼 public class Singleton { private static Singleton instance;