【漫画】趣说单例模式
【摘要】 武哥课堂开课啦,今天给大家趣味讲解设计模式中的单例模式。于是小张开始实现这个单例模式:首先我们要在单例类中将构造方法私有化,这样是防止被实例化。然后我们在单例类中自己 new 一个对象出来。最后给外界提供一个方法,返回new 出来的这个对象即可。如下:public class Singleton { // 自己内部先定义一个空对象 private static Singleton insta...
武哥课堂
开课啦,今天给大家趣味讲解设计模式中的单例模式。
于是小张开始实现这个单例模式:首先我们要在单例类中将构造方法私有化,这样是防止被实例化。然后我们在单例类中自己 new 一个对象出来。最后给外界提供一个方法,返回new 出来的这个对象即可。如下:
public class Singleton {
// 自己内部先定义一个空对象
private static Singleton instance = null;
// 私有化构造方法,防止被实例化
private Singleton() {
}
// 提供一个方法返回该对象
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
这时小帅站了起来,指出了上面这个单例模式的问题所在。
于是,小帅根据自己的思路,将小张的代码做了修改,在获取单例对象的方法上面加了个 synchronized 关键字,这样就能解决线程安全问题了。
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
所谓“饿汉式”单例模式,就是直接创建一个对象出来,简单粗暴,也没有所谓的线程安全问题了。然后提供一个方法直接把该对象返回即可。
public class Singleton {
//1.自己内部new一个
private static Singleton instance = new Singleton();
//2.私有构造函数,防止被实例化
private Singleton() {
}
//3.提供一个公共接口,用来返回刚刚new出来的对象
public static Singleton getInstance() {
return instance;
}
}
在实际中,也可以使用内部类来维护单例的实现。JVM内部的机制能够保证当一个类被加载时,这个类的加载过程是线程互斥的。这样当我们第一次调用 getInstance() 方法时,JVM能够保证 instance 实例只会被创建一次,且把赋值给 instance 的内存初始化完毕。如下:
public class Singleton {
//私有构造方法,防止被实例化
private Singleton() {
}
/*使用一个内部类来维护单例 */
private static class SingletonFactory {
private static Singleton instance = new Singleton();
}
//获取实例
public static Singleton getInstance() {
return SingletonFactory.instance;
}
}
如果让一个类产生多个对象是很简单的,直接new就行了。但是如果在单例模式下,想让你们产生多个对象该怎么办呢?思考一下吧~ 如果想不出来的话,可以点击文末左下角“阅读原文”查看。
转载声明:本文转载自公众号【程序员私房菜】。
原文链接:https://mp.weixin.qq.com/s/q0XcLZjDC-nVG4DSV_NPVQ
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)