漫画趣说单例模式

Posted 武哥聊编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了漫画趣说单例模式相关的知识,希望对你有一定的参考价值。


武哥课堂

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

【漫画】趣说单例模式


【漫画】趣说单例模式

【漫画】趣说单例模式

【漫画】趣说单例模式


于是小张开始实现这个单例模式:首先我们要在单例类中将构造方法私有化,这样是防止被实例化。然后我们在单例类中自己 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


往期福利:




每天进步一点点

以上是关于漫画趣说单例模式的主要内容,如果未能解决你的问题,请参考以下文章

用故事的形式趣说Python单例模式

大雷说单例

单例设计模式

漫画一幅漫画搞定单例模式,优化系统性能

设计模式总纲——单例设计模式

比想象中复杂一点的单例模式