【漫画】趣说单例模式

举报
Tom forever 发表于 2019/10/28 08:30:15 2019/10/28
【摘要】 武哥课堂开课啦,今天给大家趣味讲解设计模式中的单例模式。于是小张开始实现这个单例模式:首先我们要在单例类中将构造方法私有化,这样是防止被实例化。然后我们在单例类中自己 new 一个对象出来。最后给外界提供一个方法,返回new 出来的这个对象即可。如下:public class Singleton { // 自己内部先定义一个空对象 private static Singleton insta...

武哥课堂

开课啦,今天给大家趣味讲解设计模式中的单例模式

640?tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


640?tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

640?tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

640?tp=webp&wxfrom=5&wx_lazy=1&wx_co=1



于是小张开始实现这个单例模式:首先我们要在单例类中将构造方法私有化,这样是防止被实例化。然后我们在单例类中自己 new 一个对象出来。最后给外界提供一个方法,返回new 出来的这个对象即可。如下

public class Singleton {
 // 自己内部先定义一个空对象
 private static Singleton instance = null;
 // 私有化构造方法,防止被实例化
 private Singleton() {
   
 }
 // 提供一个方法返回该对象
 public static Singleton getInstance() {
   if(instance == null) {
     instance = new Singleton();
   }
    return instance;
 }
}


640?tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


这时小帅站了起来,指出了上面这个单例模式的问题所在。


640?tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

640?tp=webp&wxfrom=5&wx_lazy=1&wx_co=1



于是,小帅根据自己的思路,将小张的代码做了修改,在获取单例对象的方法上面加了个 synchronized 关键字,这样就能解决线程安全问题了。

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


640?tp=webp&wxfrom=5&wx_lazy=1&wx_co=1



所谓“饿汉式”单例模式,就是直接创建一个对象出来,简单粗暴,也没有所谓的线程安全问题了。然后提供一个方法直接把该对象返回即可。

public class Singleton {
 //1.自己内部new一个
 private static Singleton instance = new Singleton(); 
 //2.私有构造函数,防止被实例化
 private Singleton() 
   
 }
 //3.提供一个公共接口,用来返回刚刚new出来的对象
  public static Singleton getInstance() 
    return instance;
 }
}


640?tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

640?tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


在实际中,也可以使用内部类来维护单例的实现。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;  
   }  
}


640?tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


如果让一个类产生多个对象是很简单的,直接new就行了。但是如果在单例模式下,想让你们产生多个对象该怎么办呢?思考一下吧~ 如果想不出来的话,可以点击文末左下角“阅读原文”查看。



转载声明:本文转载自公众号【程序员私房菜】。    

原文链接:https://mp.weixin.qq.com/s/q0XcLZjDC-nVG4DSV_NPVQ


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。