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; } }
单例模式目的是保证在一个环境中只有一个该类对象。所以必须杜绝所以可能创建对象的方式。也就有以下几点要注意
注意事项:
- 为防止new,构造方法必须 private。
- 如果对象是可以序列化的,必须将所有实例域设置为transient。并且实现 readResolve 方法
- 为防止反射,在私有构造方法可以抛出异常.