单例模式精讲
单例(Singleton)模式 也叫单态模式,是java的23种设计模式之一。网上很多介绍,我就言简意赅点了。
一、单例模式的应用场景
1.整个程序的运行中只允许有一个类的实例;
2.需要频繁实例化然后销毁的对象。
3.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
4.方便资源相互通信的环境
场景举例:
在我们的电脑中,每一个系统的电脑,比如windows中,都会有一个任务管理器,而且只有一个,你也只能打开一个,你可以在自己电脑试一下。因为他就是类似单例这种结构的模式做出来的;还有回收站、打印机的Printer Spooler等等。
二、单例模式的在项目中的具体使用
1.封装一些常用的工具类,保证整个应用常用的数据统一
2.保存一些共享数据在内存中,其他类随时可以读取。
三、单例模式的俩种形式
懒汉式
饿汉式
四、单例模式实现步骤
1.构造方法必须进行私有化
2.实例必须是一个且唯一,并且必须加上static属性
3.对外提供获取该类对象的共有方法也是static属性
五、代码说明
(1)饿汉式:在程序创建的时候就进行初始化,并且对象唯一
public class Singleton {
private static String TAG = "Singleton";
private static Singleton singleton = new Singleton();
//单例模式的特点,构造必须私有
private Singleton() {
}
public static Singleton getInstance() {
return singleton;
}
public void hungry() {
System.out.println("Please call me 饥饿鬼");
}
}
(2)懒汉式:需要时才创建于堆中,多线程情况下不能保证唯一性
public class Singleton {
private static String TAG = "Singleton";
private static Singleton singleton = null;
//单例的特点,构造必须私有
private Singleton() {
}
public static Singleton getInstance() {
if (null == singleton) {
singleton = new Singleton();
}
return singleton;
}
public void lazy() {
System.out.println("Please call me 懒汉子");
}
}
**注意:在多线程情况下,只能使用饿汉式单例模式。
在多线程的情况下,如果多个线程下同时使用懒汉式,第一线程刚创建完准备要返回就被其他线程抢到了又重新创建了一遍,这时就有多个对象存在了,那就不符合单例的原则了。因此才有了饿汉式单例,无论是几个线程抢到并使用,对象都只会有一个。
那么,是不是就意味着在多线程的情况下不能使用懒汉式来创建单例呢?
当然不是。这个时候,就需要给线程加锁。(使用synchronized修饰公有方法即可)
public class Singleton {
private static Singleton instance;
//单例的特点,构造必须私有
private Singleton (){
}
//使用synchronized修饰
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
六、单例模式的利弊
- 优点
1.实现了整个程序对唯一实例访问的控制。
2.因为单例要求程序只能有一个对象,所以对于那些需要频繁创建和销毁的对象来说可以提高系统的性能,并且可以节省内存空间。
3.可以全局访问。
4.允许可变数目的实例。
- 缺点
1.不适用于变化频繁的对象。
2.符合的场景有限。
3.如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,可能会导致对象状态的丢失
4.可扩展性较差。