黑马程序员技术交流社区

标题: 【黑马程序员济南】Java中单例设计模式的几种常见写法 [打印本页]

作者: 大山哥哥    时间: 2017-8-31 23:42
标题: 【黑马程序员济南】Java中单例设计模式的几种常见写法
   前几天在上Java基础课的时候,讲到private关键字的作用,就是所有被private修饰的成员变量和常量都只能在本类中使用。也就说构造方法一旦被private修饰就只能在本类中使用。不能再外部创建本类的实例。一般的应用场景有两个,一个是工具类,我们就是不希望别人创建对象,所以把构造方法私有化。另一个就是单例设计模式中,我们也不希望别人随意创建实例,要想得到本类的实例,必须调用给提供的static的获取实例的方法才可以。今天咱们就来总结一下,单例设计模式的几种常见的写法有什么优缺点。
    第一种,懒汉式,线程不安全
[AppleScript] 纯文本查看 复制代码
public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
  
    public static Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}  

第二种,懒汉式,线程安全
[AppleScript] 纯文本查看 复制代码
public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static synchronized Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}

这种写法,虽然多线程的时候不会出问题,但是效率太低。
第三种,饿汉式
[AppleScript] 纯文本查看 复制代码
public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}  

在类加载时创建,避免多线程的问题。
第四种,静态内部类
[AppleScript] 纯文本查看 复制代码
public class Singleton {  
    private static class SingletonHolder {  
    private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
    return SingletonHolder.INSTANCE;  
    }  
}

也是用类加载机制来保证初始化时只用一个线程,但是好处是SingleTon被加载了,实例不一定被穿件,只用调用getInstance()方法时,才会显示的加载SingletonHolder,从而实例化Singleton.
第五种方式,枚举
[AppleScript] 纯文本查看 复制代码
public enum Singleton {  
    INSTANCE;  
    public void method() {  
    }  
}

第六种,双重检校
[AppleScript] 纯文本查看 复制代码
public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){}  
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
        }  
    }  
    return singleton;  
    }  
}  



作者: Oliverwqcwrw    时间: 2017-9-2 10:41
请问一下同学,你觉得哪种方式最优秀呢
作者: jingxian90    时间: 2017-9-2 18:00
Oliverwqcwrw 发表于 2017-9-2 10:41
请问一下同学,你觉得哪种方式最优秀呢

人家可不是同学好不好,人家是老师~哈哈
作者: jingxian90    时间: 2017-9-2 18:01
Oliverwqcwrw 发表于 2017-9-2 10:41
请问一下同学,你觉得哪种方式最优秀呢

哪种优秀?
开发中选效率最高的。 面试选代码最复杂的。 明白了吗 同学~
作者: jingxian90    时间: 2017-9-2 18:01
写的挺好,条理清晰,言简意赅,通俗易懂
作者: Oliverwqcwrw    时间: 2017-9-3 00:33
jingxian90 发表于 2017-9-2 18:01
哪种优秀?
开发中选效率最高的。 面试选代码最复杂的。 明白了吗 同学~  ...

谢谢老师的指教

作者: jingxian90    时间: 2017-9-8 11:40
Oliverwqcwrw 发表于 2017-9-3 00:33
谢谢老师的指教

嘿嘿不客气呦~有问题随时问,咱们的老师们都很乐意随时为学员解答问题




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2