应用最广的模式-单例模式

xiaoxiao2021-02-27  170

应用最广的模式—–单例模式

单例模式的介绍 单例模式是应用最广的模式之一,在应用这个模式的时候,单例对象的类必须保证只有一个实例存在,许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统的整体行为。

单例模式的定义 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 好了。说了这么多似懂非懂,贫道也腻歪,下面我们来说点实际的吧,单例模式一般会有哪些关键点呢?容贫道一一道来 1、构造函数不对外开放,一般为Private 2、通过一个静态方法或者枚举返回单例类对象 3、确保单例类的对象有且只有一个,尤其是多线程的环境下 4、确保单例对象在反序列化时不会重新构建对象

单例模式的实践 3.1.说了这么多有的没的,下面就来撸一把。分别介绍有几种实现单例模式的方法。 3.11.懒汉模式

public class Singleton { /*懒汉模式*/ private static Singleton instance; private Singleton(){} private static synchronized Singleton getInstance(){ if (instance == null ){ instance = new Singleton(); } return instance; } 好了,我们现在实现了最简单的单例。我们在getInstance()方法中添加了synchronized关键字,也就是说这个方法是个同步方法,所以这就上面所说的特点满足确保单例类的对象有且只有一个,尤其是多线程的环境下,但是我们细细的来一下啊,我们会发现一个问题,即使instance已经被初始化(第一次调用会进行初始化instance)每次调用getInstance都会进行同步,这样就会消耗不必要的资源,这也是这种模式存在的最大问题。所以呀一般也不建议使用。 3.1.2. Double cHECK lOCK(DCL)模式 public class Singleton { /*DCL模式*/ private volatile static Singleton instance = null; private Singleton() { } private static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } DCL的优点:资源利用率高,第一次执行getInstance时单例对象才会被实例化,效率高,缺点为第一次加载时反应稍微慢点,DCL时是使用最多的单例模式实现,他可以在需要的时候才实例化。并且大多数的情况下能保证单例对象的唯一性。 3.1.3 静态内部类单例模式 Created by liwenjie on 2017/5/5. */

public class Singleton { /静态内部类模式/ private Singleton() { } public static Singleton getInstance(){ return SingletonHolder.mSingleton; }

/*静态内部类*/ private static class SingletonHolder{ private static final Singleton mSingleton =new Singleton(); }

} “` 这种方式当第一次加载的时候并不会初始化mSingleton ,只有在第一次调用getInstance时候才会导致mSingleton 初始化,这种方式不仅能保证线程安全,也能保证单例对象的唯一性。同时也延迟了单例的实例化,这我比较推荐这种方式。

好了~~单例就介绍到这吧。。贫道老老实实的去搬砖了。

南无阿弥陀佛。善哉善哉~

转载请注明原文地址: https://www.6miu.com/read-16671.html

最新回复(0)