设计模式-单例设计模式

单例设计模式

必须满足以下条件:
1、某个类只能有一个实例
构造器私有化
2、必须自行创建这个实例
静态变量来保存这个唯一的实例
3、必须自行向整个系统提供这个实例
对外提供获取该实例对象的方式:1.直接暴露2.静态变量的get方法获取

几种常见形式:
饿汉式:在类初始化时直接创建对象,不存在线程安全问题,不管你是否需要都会去创建
1、直接实例化饿汉式(简洁直观)

public class Singleton1 {
    public static final Singleton1 INSTANCE = new Singleton1();
    private Singleton1(){

    }
}

2、枚举式(最简洁)

public enum Singleton2 {
    INSTANCE
}

3、静态代码块饿汉式(适合复杂实例化)

public class Singleton3 {
    public static final Singleton3 INSTANCE;
    static {
        INSTANCE = new Singleton3();
    }
    private Singleton3(){

    }
}

懒汉式:延迟创建这个实例对象
1、线程不安全(适用于单线程)

public class Singleton4 {
    private static Singleton4 instance;
    private Singleton4(){

    }
    public static Singleton4 getInstance(){
        if(instance == null){
            instance = new Singleton4();
        }
        return instance;
    }
}

2、线程安全(适用于多线程)

public class Singleton5 {
    private static Singleton5 instance;

    private Singleton5() {

    }
    public static Singleton5 getInstance() {
        if (instance == null) {
            synchronized (Singleton5.class) {
                if (instance == null) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    instance = new Singleton5();
                }
            }
        }
        return instance;
    }
}

3、静态内部类形式(适用于多线程)

/*
* 在内部类被加载和初始化时,才创建INSTANCE实例对象
* 静态内部类不会自动随着外部类的加载和初始化而初始化,它是要单独去加载和初始化的
* 因为实在内部类加载和初始化时创建的,因此是线程安全的
 */
public class Singleton6 {
    private Singleton6() {

    }

    private static class Inner {
        private static final Singleton6 INSTANCE = new Singleton6();
    }

    public static Singleton6 getInstance() {
        return Inner.INSTANCE;
    }
}

总结:看需求选择使用饿汉式还是懒汉式,如果选择饿汉式的话枚举式是最简洁的,懒汉式则是静态内部类形式最简洁

全部评论
666
点赞 回复 分享
发布于 2019-10-15 21:50

相关推荐

07-15 11:35
门头沟学院 Java
心里踏实多了,可以安心准备论文了
看不见我ffgh:牛哇佬,要不要来试一试pdd,部门氛围很好
京东开奖153人在聊
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务