1. 程式人生 > >單例類的四種寫法

單例類的四種寫法

寫一個單例類,對於很多初學者 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");
	}
}


以上就是四種單例類的寫法了,具體寫哪種還是根據具體要求選擇更合適的吧