Java 实现单例设计模式—创建型

简介

单例设计模式(Singleton Design Pattern)解起来非常简单。一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。

实现单例一般要考虑的条件:

1,构造函数用 private 修饰,访问权限的,避免外部通过 new 创建实例(对象);
2,考虑对象创建时的线程安全问题;
3,考虑是否支持延迟加载;
4,考虑 getInstance() 性能是否高(是否加锁)。

实现方式

实现单例方式:饿汉式,懒汉式,双重检测,静态内部类,枚举;

1,饿汉式

public class Setting {
    private static final Setting mSetting= new Setting();

    private Setting() {
    }

    public static Setting getInstance() {
        return mSetting;
    }
}

缺点:在类加载的时候,mSetting静态实例就已经创建并初始化完成;不支持延迟加载(在需要的时候在创建单例对象)

优点:mSetting实例的创建过程是线程安全的(在类加载的期间,就已经将 mSetting静态实例初始化好了,所以,mSetting实例的创建是线程安全的)
2,懒汉式

public class Setting {
    private static Setting mSetting;

    private Setting() {
    }

    public static synchronized Setting getInstance() {
        if (mSetting == null) {
            mSetting = new Setting();
        }
        return mSetting;
    }
}

缺点:getInstance()加了锁,如果频繁的调用的话效率很低(每次调用加锁,释放锁)导致并发度很低,为1;

优点:可以延迟加载;

3,双重检测

public class Setting {
    private static Setting mSetting;

    private Setting() {
    }

    public static  Setting getInstance() {
        if (mSetting == null) {
            synchronized (Setting.class) {
                if (mSetting == null) {
                    mSetting = new Setting();
                }
            }
        }
        return mSetting;
    }
}

优点:既可以懒加载,也支持高并发

4,静态内部类

public class Setting {

    private Setting() {
    }

    private static class SettingHolder{
        private static final Setting mSetting = new Setting();
    }


    public static Setting getInstance() {
        return SettingHolder.mSetting;
    }
}

优点:保证线程安全的同时,又作到了延迟加载;当Setting类加载的时候并不会创建静态内部类SettingHolder,只有调用getInstance()的时候才被加载;mSetting的唯一性、创建过程的线程安全性,都由 JVM 来保证;

5,枚举

public enum  Setting{
    INSTANCE
}

总结:以上五种实现方式都是线程安全的;

你可能感兴趣的:(设计模式)