单例模式的五种实现方法

Posted 小小鱼的代码基地

tags:

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

单例模式,即在让该类在运行中只存在一个实例。


这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。


注意:

  • 1、单例类只能有一个实例。

  • 2、单例类必须自己创建自己的唯一实例。

  • 3、单例类必须给所有其他对象提供这一实例。



实现方法1

在类中定义该类的静态字段,同时让类的构造函数私有。这样便无法在类的外部创建类的实例。再提供一个公有的方法,在此方法中调用构造函数,判断静态字段是否被创立,若没有,则创建单例,若有,返回单例子段。



单例模式的五种实现方法


可以看到,在创建了Singleton2这个新的实例后,Sigleton1的number值也发生了变化,所以这两个引用变量其实都引用这个静态单例字段变量。、


缺陷

在多线程中,如果两个线程同时访问到单例为null,则两个线程都会创建一个单例。


方法2

利用同步锁。

在公有方法中,先加上同步锁再进行单例判断,这样就只会有一个线程访问到单例子段,等同步锁解除时,第二个线程再访问时单例模式已经创立。



单例模式的五种实现方法


缺陷

同步锁比较消耗性能,在以后每次想要访问的时候,都需要上锁,影响性能。


方法3

在方法2的基础上,可以把同步锁放在单例判断之后,即先判断实例是否为null,只有在实例未被创立的时候,即第一次遇到两个线程同时访问,才会创建同步锁,之后的访问,实例都已经被创建,直接返回实例。


单例模式的五种实现方法


c#静态构造函数方法

c#语法中,允许程序员实现一个静态构造函数,静态构造函数会在该类第一次出现时调用。调用构造函数时,会先初始化静态变量,所以在声明单例子段的时候便实例化出来,在静态构造函数中,直接返回该实例就行。



缺陷

由于静态构造函数会在第一次出现这个类的时候便调用,有事我们只需要调用该类的静态方法,并不需要创建实例,它也会创建出实例。降低内存性能。


终极解法

在类中,声明一个私有类。类中包含一个我们需要的单例类的静态字段并实例化,并且提供一个空的静态构造函数。


而在单例模式的类中,我们为单例子段提供一个set访问器,在访问器中调用私有类的静态单例子段。


这样,在我们需要单例的实例的时候,我们就会使用到私有类,私有类的静态构造函数便会创建出单例类的实例,并返回。


而在不需要实例,只需要一些静态函数时,便不会创建单例,提高内存性能。



以上是关于单例模式的五种实现方法的主要内容,如果未能解决你的问题,请参考以下文章

Python 实现单例模式的五种写法

常见的五种单例模式实现方式

C# 单例模式的五种写法

C# 单例模式的五种写法

五种单例模式实现

快速理解Java中的五种单例模式