java设计模式之单例模式

单例(Singleton)模式

Singleton拥有一个私有构造函数,确保用户无法通过new直接实例它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()

注意:不要使用单例模式存取全局变量。这违背了单例模式的用意,最好放到对应类的静态成员中。

不要将数据库连接做成单例,因为一个系统可能会与数据库有多个连接,并且在有连接池的情况下,应当尽可能及时释放连接。Singleton模式由于使用静态成员存储类实例,所以可能会造成资源无法及时释放,带来问题。

sealed class Singleton
{
   private Singleton();
   public static readonly Singleton Instance=new Singleton();
}

Singleton类被声明为sealed,以此保证它自己不会被继承。也有一些问题,比如无法继承,实例在程序一运行就被初始化,无法实现延迟初始化等

解决的问题:保证一个类在内存中的对象是唯一的(对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性)

如何保证对象的唯一性呢?

1、不允许其他程序用new创建该类对象

2、在该类中创建一个本类实例

3、对外提供一个方法可以让其他程序获取该类对象

步骤:

1、私有化该类的构造函数

2、通过new在本类中创建一个本类对象

3、定义一个公有的方法,将创建的对象返回

java设计模式之单例模式

饿汉式和懒汉式

 java设计模式之单例模式

java设计模式之单例模式

java设计模式之单例模式

值得注意的是懒汉式(即延迟加载)单例设计模式存在着多线程安全隐患,为解决该问题,需加上同步代码块synchronized(当前类名.class),同步锁为当前类名.class。注意不能为this,因为该函数为静态函数不允许this出现。此外,还在同步代码块之前又加了一次if语句判断。该语句是为了提高代码的效率,避免每个线程都要进行同步锁的判定。

懒汉式加同步锁

java设计模式之单例模式 

静态内部类实现方式

 java设计模式之单例模式

使用枚举实现单例模式

 java设计模式之单例模式

饿汉式和懒汉式的区别:

在单线程中,饿汉式是空间换取时间(效率),懒汉式是时间换取空间。

在多线程中,饿汉式没有线程安全隐患,懒汉式存在线程安全隐患,可能会创建多个对象。