浅谈单例模式实际的使用

前言

单例模式,设计模式中最简单的一个模式,也是面试中的大热门。下面是单例模式的定义,来自于百度

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例

常见的单例模式实现

懒汉式单例

public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  

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

饿汉式单例

public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
        return instance;  
    }  
}  

我的看法

看完前面内容的人也许会说,这些东西百度一下到处都是了,还有人可能会说懒汉式的例子不是线程安全的,甚至还会有人说除了这两种以外还有好多种。但是如果按照这些来补充,我的这篇东西和百度上那些千律一篇的博客有什么区别呢?

前面的内容,我只是简单地介绍了一下什么是单例模式。在我看来,单例模式只是在一个一定范围内确保全局有且只有一个实例。简单来说,单例模式就是为了确保唯一性

学习一个设计模式,不是简单地看完概念,照着别人的代码炒了一遍就算了。还需要思考单例模式可以用在什么场景,在那些框架中使用的单例模式,为什么要用单例模式?

下面我会围绕着几个问题来分析单例模式

JDK中的单例模式

说到JDK中的单例模式就不得不提枚举了,枚举是JDK 1.5提供的新特性,枚举可以看作是一个特殊的类。定义如下(来自于百度):

在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。

这个定义相当的晦涩,其实简单来说:枚举就是把一些常量实例化为唯一的对象。例如可以把月份,星期之类的定义成枚举。

除了枚举以外,Class对象也是单例的。

Spring中的单例模式

Spring可以说是最常用的框架,在Spring中把对象封装成Bean,而有过了解的朋友都知道Spring的Bean有一个属性scope。而scope有个参数就是singleton,即单例模式。当scope属性为singleton时,spring容器中就只会存在一个Bean实例。
需要注意的是这个唯一性是靠唯一ID来确保的,即意味着会存在同一个类不同ID的Bean实例。

分布式下的单例模式

分布式可以说是当下很热门的概念,那么单例模式在分布式环境下是否依然实用呢?我以分布式Session举例吧,分布式Session常见的做法就是用一个全局缓存(如Redis)存储Session对象,多个Web应用共享这个Session对象,这个不就是活生生的单例吗?还有就是分布式ID某种意义上也可以说是单例模式,起码生成出来的分布式ID需要全局唯一。

生活中的单例模式

我算是一个游戏爱好者,那就以游戏来举例吧,一般RPG网络游戏账号下都支持多个游戏角色,但是每个游戏角色只能允许同一时刻一个地方登陆。有些游戏甚至一个账号只能由在一个地方登陆。

如果上面的例子不够清晰,我就用我们日常使用的软件举例:PC的QQ和移动端的微信也是这样的,同一时间只能允许一台设备登陆。

你可能感兴趣的:(设计模式)