单例模式(Singleton Pattern)

设计模式大概算是过了一遍了,但总体来说还不是很清楚,因此想在这里全面的总结一下。

因为之前学设计模式的时候是用C++写的,在这里就不再用C++再写一遍了,所以本体系中的所有设计模式都将会以java代码实现,有兴趣的读者可以自行用C++实现。

OK,话不多说,先从单例模式开始。

单例模式是最简单的设计模式之一,这种设计模式是一种创建型的模式,提供了创建对象的最佳方式。

单例模式顾名思义就是一个类只允许创建一个实例,因此它只涉及到一个单一的类,并且这个类要完成自己创建自己的实例的工作,并保证能且只能创建一个实例。这个类还需要提供一个访问这个实例的方法。

接下来我们分析一下单例模式的多种实现方式。(以下代码均为Java实现,若读者有兴趣可自行用C++实现)

一、懒汉形式(延迟加载)

public class Singleton{
    private static Singleton singleton;//定义一个未初始化的私有静态对象,外部不可访问

    //构造私有,保证外部不可创建实例
    private Singleton() {
    }

    //提供公有方法获取实例
    public synchronized static Single newInstance() {
        if (singleton== null) {
            singleton= new Singleton();//如果singleton为空就为其创建实例
        }
        return singleton;//将创建好的实例返回
    }
}

懒汉形式是标准的单例实现形式,它的延迟加载体现在newInstance方法里的判断,方法加了synchronized关键字可以避免多线程问题,但会影响程序性能。

二、饿汉形式(贪婪加载)

public class Singleton {
    private static Singleton singleton= new Singleton();//直接创建私有静态实例

    //构造方法私有保证外部不可创建实例
    private singleton() {
    }

    public static Singleton newInstance() {
        return singleton;//将创建好的实例返回
    }
}

在单例对象声明的时候就直接初始化对象,可以避免多线程问题,但是如果对象初始化比较复杂,会导致程序初始化缓慢。

三、双重锁检查

public class Singleton {
    private volatile static Singleton singleton;

    private Singleton() {
    }

    public static Singleton newInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

这个是懒汉形式的加强版,将synchronized关键字移到了newInstance方法里面,同时将singleton对象加上volatile关键字,这种方式既可以避免多线程问题,又不会降低程序的性能。但volatile关键字也有一些性能问题,不建议大量使用。

四、Lazy initialization holder class

public class Singleton {
    private static class SingletonHolder {
        private static Singleton singleton = new Singleton();
    }

    private Singleton() {
    }

    public static Singleton newInstance() {
        return SingletonHolder.singleton;
    }
}

这里创建了一个内部静态类,通过内部类的机制使得单例对象可以延迟加载,同时内部类相当于是外部类的静态部分,所以可以通过jvm来保证其线程安全。这种形式比较推荐。

五、枚举

public enum Singleton {
    singleton
}
单因素的枚举类已经实现了单例,这种方法更加简单。


全部评论

相关推荐

投递华为等公司7个岗位
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务