通俗解释
单例模式,顾名思义,就是说系统中这个类只能有一个实例对象。你在不同的的包里或者不同的的类里获取的对象都是同一个。
如何实现
那么我们如何实现它呢?我觉得有这么几个要点。
1.这个类只能有一个实例对象。
2.我们不能创建这个类的实例,只能它自己创建。
3.系统必须能够获取它。
这些都是废话,瞎说的,我们还是直接看代码吧,先写一个小小的例子。那我们就先写一个任务管理器类吧(你能打开两个任务管理器吗?手动滑稽)。为了不让别人随随便便创建这个类,我们就先把构造器私有化。但是我们怎么让系统获取它呢?那就用一个静态变量来保存它,并给它public
看代码:
如此我们就写了简单的单例模式的实现。我们来运行测试一下
我们看到,两次获取的对象都是一样的。说明我们的单例模式还是成功的。
扩展
当然实现单例模式的方式有很多,这只是其中一种。除此之外呢,我们使用枚举等方式也可以实现单例模式。
不知道大家有没有发现,我们这种方式是启动的时候直接就把对象创建出来了,有时候我们可能不想让它直接创建出来,而是到使用的时候才把对象创建出来。所以呢,这个单例模式它常见的有这么两种,一种是像我这样直接创建对象的,叫饿汉式,还有一种延迟创建对象的,使用的时候才创建对象,这叫懒汉式。这个懒汉式怎么实现呢,我们还得需要有一个静态变量保存这个对象,但是并不直接实例化,再来一个静态方法进行实例化这个对象并返回它,这样的话,我们只有调用这个静态方法的时候才会创建这个对象,如此便简单的实现懒汉式。不过这样的实现你还要考虑一下线程安全的问题。
真正的应用场景不会像我这么简简单单的实现。需要考虑的问题有很多,比如线程安全啦,反射攻击啦,反序列化啦等等。里面的学问还挺多呢,我们还得谦虚的深入学习。
应用场景
应用场景我就举一个例子吧,比如springIOC容器,里面存放的bean默认都是单例模式,当我们要使用的时候直接拿来用就行,我想这样做就避免了我们频繁的创建对象。
好了,水平有限,就说这么多了,重在理解思想嘛