设计模式是我们每一个程序猿(媛)职业生涯中或早或晚接触的进阶必经之路,而我设计模式是前人经过大量的实践总结出的可复用的问题解决方案,我们能够从中受益。并且合理使用设计模式能够使代码结构更加清晰、更容易维护。那么在这篇博客中我们主要介绍设计模式之单例模式。
首先我们应该清楚什么是单例模式以及我们应该在什么时候怎样使用单例模式。
单例模式能够保证一个类只对外界提供一个实例并且易于访问从而实现资源控制,如果我们希望系统中某个类的对象只存在一个,那么单例模式是最好的解决方法。那么下面我们来看一个单例模式的常用实现,在这之前我们要清楚单例模式的三个要点:一是一个类只存在一个实例,二是这个唯一的实例要自行创建,三是要提供实例的全局访问点。
单例模式之饿汉模式:
public class SingletonHungry {
private static SingletonHungry instance =new SingletonHungry();
private SingletonHungry() {}
public static SingletonHungry getInstance() {
returninstance;
}
}
饿汉模式适合单例对象初始化速度快并且占用内存小的时候。如果单例对象的初始化操作比较耗时或者占用的内存较大或者该单例对象在特定情况下才会使用那么需要根据需求延迟实例化。那么这时使用懒汉式比较适合。
单例模式之懒汉模式:
public class SingletonSlob {
private static SingletonSlob instance =null;
private SingletonSlob() {}
public static SingletonSlobgetInstnce() {
if (null ==instance) {
instance =newSingletonSlob();
}
returninstance;
}
}
上述懒汉式适合在单线程中使用,在多线程中多个线程可能会并发的调用instance=new SingletonSlob()方法从而导致多个线程创建多份相同的实例。这时我们需要加同步锁来解决这个问题。而饿汉式不会出现懒汉式的问题,因为jvm只会加载一次单例类。
懒汉单例双重校验:
public class DoubleLocakedSingletonSlob {
private static DoubleLocakedSingletonSlob instance =null;
private DoubleLocakedSingletonSlob() {}
public static DoubleLocakedSingletonSlobgetInstance() {
if (null ==instance) {
synchronized (DoubleLocakedSingletonSlob.class) {
if (null ==instance) {
instance =new DoubleLocakedSingletonSlob();
}
}
}
returninstance;
}
}
静态内部类:
静态内部类中创建静态内部类,只要应用中不使用内部类jvm就不会加载该类,从而实现延迟和线程安全
public class InnerClassSingletonSlob {
private static class SingletonFactory {
public static InnerClassSingletonSlob instance =new InnerClassSingletonSlob();
}
private InnerClassSingletonSlob() {
};
public static InnerClassSingletonSlobgetInstance() {
return SingletonFactory.instance;
}
}
枚举实现:
public enum SingletonEnum{
INSTANCE;
public void doSomething(){
System.out.println("do sth.");
}
}
由于本人水平有限,难免出现不正确的地方,请大家多多包涵,共同学习。