java 创建单例模式的几种方式及注意事项 - 点滴记忆*记忆点滴
收藏本站

java 创建单例模式的几种方式及注意事项

    单例模式是java 设计中常用创建模式,特别适合于一些可以共用,及特别占用资源的类的创建。

    创建单例模式类方式常被分为懒汉式和饿汉式。下面简单列出各种方式代码并简单分析。

   

懒汉式一

/**
 * 单例模式测试
 * @author tjx
 */
public class SingleTest {
	//这是饿汉式,类一加载就创建改类对象创建好。
	//这种方式优点:简单,快捷,不需要考虑同步
	//缺点:如果该类的创建是比较耗资源,可能会导致在
	//某些引用了该类,但尚未使用该类对象时,该类仍被创建。
	public final static SingleTest INSTANCE = new SingleTest();
	
}



懒汉式二

/**
 * 单例模式测试
 * @author tjx
 */
public class SingleTest {
	//这是懒汉式另一种形式。
	//这种方式优点:更直观看出该类为单例模式。
	//并且提供更多灵活性,可在不改变API情况下改变其是否为单例
	//可以结合泛型使用
	//缺点:同懒汉式
	private static SingleTest INSTANCE = new SingleTest();
	
	public static  SingleTest getInstance(){
		return INSTANCE;
	}
}


枚举式

/**
 * 单例模式测试
 * @author tjx
 */
public enum SingleTest {
	//这是java 1.5 以后创建另一种形式。
	//这种方式优点与懒汉式2方法相近,但更简洁
	//并且绝对防止反序列化及反射
	//是java 1.5 之后最佳的方式
	INSTANCE;

}

饿汉式
/**
 * 单例模式测试
 * @author tjx
 */
public class SingleTest {
	//这是懒汉式,类一加载就创建改类对象创建好。
	//这种方式优点:在对象被使用时才创建对象。
        //适用于比较耗资源单例类
	//缺点:为防止在多线程出错,需声明为同步方法
	private static SingleTest INSTANCE = null;
	
	public static synchronized SingleTest getInstance(){
		if(INSTANCE == null)
		{
			INSTANCE = new SingleTest();
		}
		return INSTANCE;
	}
	
}

单例模式目的是保证在一个环境中只有一个该类对象。所以必须杜绝所以可能创建对象的方式。也就有以下几点要注意

注意事项:

  1. 为防止new,构造方法必须 private。
  2. 如果对象是可以序列化的,必须将所有实例域设置为transient。并且实现 readResolve 方法
  3. 为防止反射,在私有构造方法可以抛出异常.
以上几点针对懒汉和饿汉式方式,对于枚举式因为有jdk 保证可以不用考虑。所以说枚举式是最佳方式。

    留下足迹