黑马程序员技术交流社区
标题: 【黑马程序员济南】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
人家可不是同学好不好,人家是老师~哈哈
作者: jingxian90 时间: 2017-9-2 18:01
哪种优秀?
开发中选效率最高的。 面试选代码最复杂的。 明白了吗 同学~
作者: jingxian90 时间: 2017-9-2 18:01
写的挺好,条理清晰,言简意赅,通俗易懂
作者: Oliverwqcwrw 时间: 2017-9-3 00:33
jingxian90 发表于 2017-9-2 18:01 
哪种优秀?
开发中选效率最高的。 面试选代码最复杂的。 明白了吗 同学~ ...
谢谢老师的指教


作者: jingxian90 时间: 2017-9-8 11:40
嘿嘿不客气呦~有问题随时问,咱们的老师们都很乐意随时为学员解答问题
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |