單例類的四種寫法
阿新 • • 發佈:2019-01-31
寫一個單例類,對於很多初學者 Java 的人來說算是基本功吧,看到很多的面試題都會有寫一個單例類的題目。
相信單例類在後面的很多地方會用到(一個還未入職的 JAVA 學習者)
本人在一個 Java 學習視訊中看到寫單例類的四種方式,現在搬到這裡來學習下
一、首先是一種簡單的常規的方式,但是這種寫法在多執行緒執行情況下可能產生多個例項
二、第二種方法對第一種方法進行了改進,直接在公共域生成了一個例項,多執行緒執行時就不用每次都生成例項了package singleton; //簡單方式:在併發過程中可能存在多個例項 public class SingletonDemo1 { private static SingletonDemo1 INSTANCE; private SingletonDemo1(){} public static SingletonDemo1 getInstance(){ if(INSTANCE == null){ INSTANCE = new SingletonDemo1(); } return INSTANCE; } }
package singleton;
//公共域方式:簡單
public class SingletonDemo2 {
public static final SingletonDemo2 INSTANCE = new SingletonDemo2();
private SingletonDemo2(){}
}
三、第三種方法是利用了工廠模式,可以在其中的方法中加入自己的要求、特點
package singleton; //工廠化方法:可以在例項過程中新增邏輯 public class SingletonDemo3 { private static SingletonDemo3 INSTANCE = new SingletonDemo3(); private SingletonDemo3(){} public static SingletonDemo3 getInstance(){ return INSTANCE; } }
四、第四種方法是利用了列舉方式,據說是最簡單的。只要四個單詞
package singleton;
//列舉方式:最佳實踐 推薦
public enum SingletonDemo4 {
INSTANCE;
public static void output(String s){ //用於測試寫的一個方法
System.out.println("Hello, " + s);
}
}
最後,下面是一個測試類
package singleton; public class SingletonTest { public static void main(String[] args) { System.out.println("SingletonDemo1: " + SingletonDemo1.getInstance()); System.out.println("SingletonDemo1: " + SingletonDemo1.getInstance()); System.out.println("SingletonDemo2: " + SingletonDemo2.INSTANCE); System.out.println("SingletonDemo2: " + SingletonDemo2.INSTANCE); System.out.println("SingletonDemo3: " + SingletonDemo3.getInstance()); System.out.println("SingletonDemo3: " + SingletonDemo3.getInstance()); System.out.println("SingletonDemo4: " + SingletonDemo4.INSTANCE); System.out.println("SingletonDemo4: " + SingletonDemo4.INSTANCE); SingletonDemo4.INSTANCE.output("Boy"); } }
以上就是四種單例類的寫法了,具體寫哪種還是根據具體要求選擇更合適的吧