单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。 |
单例模式结构
单例模式有三个要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供全局访问接口。单例模式是结构最简单的设计模式一,在它的核心结构中只包含一个被称为单例类的特殊类。单例模式结构如下图所示:
单例模式结构图中只包含一个单例类角色:
● Singleton(单例类):在单例类的内部实现只生成一个实例,同时它提供一个静态的getInstance()工厂方法,让客户可以访问它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有;在单例类内部定义了一个Singleton类型的静态对象,作为外部共享的唯一实例。
单例模式实现
解决方案一 单例模式的经典实现 单例类中的getInstance()方法是静态的,这意味着它是一个类方法,所以可以在代码的任何地方使用Singleton.getInstance()访问它,这和访问全局变量一样简单,只是多了个优点:单例可以延迟实例化。其关键代码如下所示;
|
在实际应用中,如果涉及到多线程问题的处理时,解决方案一则会出现非常严重的问题。现在我们对解决方案一的代码进行详细分析,当第一次调用getInstance()方法创建单例类的实例时,uniqueInstance对象为null值,因此系统将执行代码uniqueInstance= new Singleton(),在此过程中,由于要对单例类Singleton进行大量初始化工作,需要一段时间来创建Singleton对象。而在此时,如果再一次调用getInstance()方法(通常发生在多线程环境中),由于uniqueInstance可能还未创建成功,仍为null值,判断条件(uniqueInstance== null)为真值,因此代码uniqueInstance= new Singleton()将再次执行,导致创建了多个uniqueI