漫画趣说单例模式
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就行了。但是如果在单例模式下,想让你们产生多个对象该怎么办呢?思考一下吧~ 如果想不出来的话,可以点击文末左下角“阅读原文”查看。
往期福利:
!
每天进步一点点
以上是关于漫画趣说单例模式的主要内容,如果未能解决你的问题,请参考以下文章