介绍
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。
实际运用
例如一个嵌入到微信的项目,里面有这微信登入、微信分享文章、微信获取位置等功能。那么用到微信登入这个功能,首先就要获取access_token。下面是关于获取access_token的说明。
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
公众平台的API调用所需的access_token的使用及生成方式说明:
1、建议公众号开发者使用中控服务器统一获取和刷新Access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务;
2、目前Access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器对外输出的依然是老access_token,此时公众平台后台会保证在刷新短时间内,新老access_token都可用,这保证了第三方业务的平滑过渡;
3、Access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。
当然,我这里只是介绍如何用单例模式保存这些信息,微信js的access_token也是如此。文中的map就是用来存储access_token和access_token创建时间。
分类
单例模式的创建方式可以分为两种,一种是饿汉式、一种是懒汉式。顾名思义饿汉式就是迫切的把实例初始化,懒汉式就是当调用时在进行初始化。
饿汉式
由于饿汉式篇幅较少,所以先介绍
public class EagerlySingleton {
private EagerlySingleton(){};
private static Map<String,Object> map = new HashMap<String, Object>();
/**
* <p>Description: 解决多线程问题方式二(饿汉)</p>
*/
public static synchronized Map<