浅析Java设计模式——单例模式(2)

浅析Java设计模式——单例模式(2)

单例模式的实现方法有很多,关于懒汉式基本方法及其双重锁检测的方法,已在上篇文章中进行了介绍。

文章链接:浅析Java设计模式——单例模式(1)

本次介绍通过饿汉式、静态内部类及枚举的方式来实现单例模式。

1.饿汉式

public class Singleton{
private static Singleton instance=new Singleton();//单例对象
private Singleton(){
}
//静态工厂方法
public static Singleton getInstance(){
return instance;
}
}

饿汉式比较容易,当一个线程访问Singleton类时,单例对象就已经创建;而懒汉式则是当线程调用getInstance方法时才创建单例对象。

2.静态内部类

public class Singleton{
private Singleton(){
}
//静态内部类
private static  class Lazy{
private static final Singleton INSTANCE=new Singleton();
}
public static Singleton getInstance(){
return Lazy.INSTANCE;
}
}

静态内部类方法也必须设置为private,保证外部只能通过调用getInstance方法才能得到单例对象。

还有静态内部类的单例对象是在调用getInstance方法时,使类Lazy加载进行初始化的,所以该方法也是懒汉式的一种。

3.枚举方式

之前所介绍的实现方法其实都有一个缺点:就是可以通过反射机制来打破只能构建一个实例的规则。反射可以通过构造器来构造不同的对象,即使之前实例在内部进行创建。而枚举则可以防止反射的方式构建对象。

public enum Singleton{
INSTANCE;
}

枚举方式之所以能实现单例模式,是因为其自身有且仅有private的构造器,并且枚举类是final的,即它是不能够被继承的。其次它也能够保证线程安全和自由序列化。尤其是序列化,当枚举类对象被反序列化的时候,它总是能够保证反序列的返回值是同一个对象。当然枚举也有其自身的不足:就是它并非使用的是懒加载,单例对象是在枚举类被加载的时候就初始化了。

模式优缺点:

(1)优点:可以对这个唯一实例的访问进行控制;节约系统资源,提高系统性能。

(2)缺点:难以扩展,单例职责过重。

模式的应用:

(1)Java语言类库JDK中有很多运用单例模式的例子。比如 java.lang.Runtime 类,在每一个Java应用程序里边都有唯一的一个 Runtime 对象,程序通过它和运行环境相互作用。Runtime 类的源代码如下:

public class Runtime{
    private static Runtime currentRuntime = new Runtime();
    public static Runtime getRuntime(){
    }
    private Runtime(){
    ....
    }
 }

(2)JavaEE 框架 Spring 中,Spring 会通过单例模式创建某个类的实例,即在 Spring 的 bean 工厂中 bean 的实例只有一个,代码如下:

<bean id = "date" class = "java.util.Date" scope = "singleton"/>

以上就是单例模式实现的几种方法,如若有不对的地方还请指出,交流学习。

猜你喜欢

转载自blog.csdn.net/qq_38190057/article/details/79632918