單例模式-Singleton的幾種方式

實例證實用枚舉方式實現單例是最佳方式; java

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.lang.reflect.Constructor;

public class Singleton {
	public static void main(String[] args) throws  Exception {
		Class<?> clazz = Singleton3.class;
		Constructor[] c = clazz.getDeclaredConstructors();
		if(c.length>0) {
			/**更改默認控制,使私有類型能夠訪問**/
			c[0].setAccessible(true);
			Object obj = c[0].newInstance(null);
			Object obj2 = Singleton3.INSTANCE;
			System.out.println(obj == obj2);//false
		}
		/**經過序列化和反序列化生成不一樣的對象**/
		Singleton2 sing = Singleton2.INSTANCE;
		seriObj(sing);
		Class<?> clazz2 = Singleton2.class;
		Constructor[] c2 = clazz2.getDeclaredConstructors();
		if(c2.length > 0) {
			c2[0].setAccessible(true);
			//Object obj3 = c2[0].newInstance(null);
		}
		Class<?> clazz4 = Singleton4.class;
		Constructor[] c4 = clazz4.getDeclaredConstructors();
		if(c4.length > 0) {
			c4[0].setAccessible(true);
			/**運行時異常,提示不能反射建立枚舉類型**/
			//Object obj6 = c4[0].newInstance(null);
		}
		/**序列化枚舉,反序列化獲得的是同一個對象**/
		seriObj(Singleton4.SINGLETON);//true
	}
	private static void seriObj (Object obj) throws Exception, IOException {
		cleanFile("object.txt");
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("object.txt"));
		out.writeObject(obj);
		out.close();
		ObjectInputStream in = new ObjectInputStream(new FileInputStream("object.txt"));
		Object sing2 = in.readObject();
		in.close();
		System.out.println(obj.getClass().getSimpleName()+":"+(obj == sing2));//false
	}
	private static void cleanFile(String path) {
		File file = new File(path);
		if(file.exists()) {
			if(file.isFile()) {
				/**刪除文件**/
				file.delete();
			}
		}
	}
}
class Singleton3 {
	public static final Singleton3 INSTANCE = new Singleton3();
	private Singleton3() {}
}
class Singleton2 implements Serializable{
	public static final Singleton2 INSTANCE = new Singleton2();
	private Singleton2() {
		/**能夠經過拋出異常的方式阻止建立對象**/
		if(null !=INSTANCE) {
			throw new RuntimeException("系統不能同時存在多個實例!");
		}
	}
}
enum Singleton4 {
	SINGLETON,
	Singleton4() {
		
	}
}
相關文章
相關標籤/搜索