查看原文
其他

【漫画】趣说单例模式

倪升武 程序员私房菜 2018-12-05

点击关注上方“程序员私房菜”,设为“星标”或“置顶公众号”,第一时间送达实用技术干货。


武哥课堂

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




于是小张开始实现这个单例模式:首先我们要在单例类中将构造方法私有化,这样是防止被实例化。然后我们在单例类中自己 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就行了。但是如果在单例模式下,想让你们产生多个对象该怎么办呢?思考一下吧~ 如果想不出来的话,可以点击文末左下角“阅读原文”查看。

END


往期福利:

500套简历模板,总有一款适合你

全网最全!最新!最优质的视频资源!

架构师全套免费视频教程,都在这里!!


关注我们

每天进步一点点

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存