1. 程式人生 > 其它 >Java23種設計模式——單例模式

Java23種設計模式——單例模式

技術標籤:java設計模式java

單例模式

單例模式是結構最簡單的設計模式,在它核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以確保系統中的一個類只有一個例項而且該例項易於被外界訪問,從而方便對例項個數進行控制,節約系統資源。

一、餓漢式單例類

餓漢式單例類是實現起來最簡單的單例類。

package Singleton;

//餓漢式單例模式
public class Hungry {

    //構造器私有,就不能new這個物件
    private Hungry(){

    }

    private final static Hungry HUNGRY=new Hungry();

    public static Hungry getInstance(){
        return  HUNGRY;
    }
}

二、懶漢式單例類

懶漢式單例類的建構函式也是私有的,但它在第一次被引用時將自己例項化,在被載入時不會將自己例項化。

package Singleton;

//懶漢式單例模式  DCL
public class LazyMan {

    private LazyMan(){
        System.out.println(Thread.currentThread().getName()+"ok");
    }

    private static LazyMan lazyMan;

    public static LazyMan getInstance(){
        if(lazyMan==null){
            lazyMan=new LazyMan();
        }
        return lazyMan;
    }

    //單執行緒下單例ok
    //多執行緒
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                LazyMan.getInstance();
            }).start();
        }
    }
}

使用雙重檢查鎖定實現的懶漢式單例類

package Singleton;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

//懶漢式單例模式  DCL
public class LazyManDCL {


    private LazyManDCL(){

     
    }

    private volatile static LazyManDCL lazyMan;

    //雙重檢測DCL懶漢式
    public static LazyManDCL getInstance(){
        if(lazyMan==null){
            //加鎖
            synchronized (LazyMan.class){
                if(lazyMan==null){
                    lazyMan=new LazyManDCL();//不是一個原子操作
                    /*
                    1.分配記憶體空間
                    2.執行構造方法,初始化物件
                    3.把這個物件指向這個空間
                    123
                    132 A
                    123 B 此時這個lazyman還沒有構造
                     */
                }
            }
        }
        return lazyMan;
    }

    //單執行緒下單例ok
    //多執行緒
   public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                LazyManDCL.getInstance();
            }).start();
        }
    }

   
}

三、使用靜態內部類實現單例模式

package Singleton;

//靜態內部類
public class Holder {

    //構造器私有
    private Holder(){

    }

    public static Holder getInstance(){
        return InnerClass.HOLDER;
    }

    public static class InnerClass{
        private static final Holder HOLDER=new Holder();
    }
}