单例模式是23种设计模式中最常用的模式之一。单模式屏蔽了对象的初始化,可以很方便地获取对象而不用每次都去初始化它。由于易用且好用,在很多情况下都会来一个单例模式的类。本文要强调的是,虽然好用,单例模式绝不能滥用。在使用的时候,还需要仔细地斟酌。
1. 单例模式是缓存的表现形式之一。
单一对象一旦初始化后,将会在程序运行过程中长驻内存。既然属于缓存,那么就需要考虑,哪些对象是需要缓存,而哪些对象不需要。毕竟系统的资源是有限的,不可能对所有的内容都进行缓存。如果对象不是使用得太频繁,就需要考虑,缓存这样的对象值不值得。
2. 如果使用了单例模式,就意味着,其它模块对这个模块的引用总是1,而无法达到1对多或多对多的引用,也就是说,对象的使用受到了限制。而调用者只能反复使用这一个对象,你能保证对象随时都处于一可预定的状态吗?如果不能,那就不要使用单例模式。如果对象是无状态的,就比较合适提供为单例模式。从系统的扩展方面来考虑,如果需要反复使用一个对象,应该提供另外一个Provider类或Cache类,在这个类中,缓存某个对象,并为外界提供访问这个对象的接口。
3. 单例模式限制了对对象的扩展。一个被设计成单例模式的类如果扩展?恐怕比较别扭。我的经验是,一个应用程序或框架中,除了以下几种角色的类外,应该避免使用单例类。
- 提供数据的辅助类
- 使用频繁并且是无状态,不需要同步的类
- 创建对象的类,如Provider、Cache、Builder、Factory这些类
- 配置操作类