创建单例模式的几种方式

单例模式主要作用是保证在Java应用程序中,一个类只有一个实例存在。

第一种形式是把类的构造函数设置为private的,它有一个static的private的该类变量,在类初始化时实例化,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。

下面我将用这种方式写一个单例模式的例子:饱汉模式以空间换时间,直接创建实例,以后不用判断直接用。

	public class FirstSingletonPattern {
	private FirstSingletonPattern() {}
	
	private static FirstSingletonPattern obj = new FirstSingletonPattern();
	
	public static FirstSingletonPattern getInstance() {
		return obj;
	}
}

下面我将用另一种方式写单例模式的例子:饥汉模式以时间换空间,用的时候才生产实例,每次都判断

/**
 * 这个方法比上面有所改进,不用每次都进行生成对象,只是第一次使用时生成实例,提高了效率! 
 */
public class SecondSingletonPattern {
	
	private SecondSingletonPattern() {}
	
	private static SecondSingletonPattern instance = null;
	
	/*
	 * 由于我们将一个本类对象的引用定义成一个成员变量,所以我们应该加入同步锁,
	 * 为了防止多线程进入此方法,而产生多个实例
	 */
	public static synchronized SecondSingletonPattern getInstance() {
		if(instance == null) {
			instance = new SecondSingletonPattern();
		}
		return instance;
	}
}

第三种方式是用枚举创建一个单例:

public enum ThirdSingletonPattern{
	OBJ;
}

但是,我们有了反射以后,这种单例模式似乎并不ok!!!

下面我将用反射的方式获取第一种单例模式的多个实例对象。
public class ObtainManyInstance {
	public static void main(String[] args) {
		try {
			Class firstSingletonPattern = Class.forName("com.java.day03.FirstSingletonPattern");
			Constructor constructor = firstSingletonPattern.getDeclaredConstructor();
			constructor.setAccessible(true);
			FirstSingletonPattern instance = (FirstSingletonPattern) constructor.newInstance();
			System.out.println(instance);
			FirstSingletonPattern instance2 = (FirstSingletonPattern) constructor.newInstance();
			System.out.println(instance2);
		} catch (Exception e) {}
	}
}
我们用枚举方式来创建单例模式还是很ok的。

java的反射技术不要用于实例创建,反射主要用于一些框架技术。

你可能感兴趣的:(单例模式,反射)