文章目录
前言
单例模式是在处理数据的时候,为了保证数据的一致性。有时候我们需要让类的实例化只能有一次,但类的实例化有多个时就会造成数据出现多次,或者数据出现不同。
一、单例模式定义和特点
1.1、单例模式的定义
官方话:单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。
我的理解的话,也是这样没毛病(哈哈哈哈),这个设计模式应该是最简单的,真的超级简单。
1.2、单例模式的特点
它主要有三大特点:
- 单例类只有一个实例对象;
- 该单例对象必须由单例类自行创建;
- 单例类对外提供一个访问该单例的全局访问点。
二、单例模式的优缺点
2.1、优点
单例模式的优点:
- 单例模式可以保证内存里只有一个实例,减少了内存的开销。
- 可以避免对资源的多重占用。
- 单例模式设置全局访问点,可以优化和共享资源的访问
2.2、缺点
单例模式的缺点:
- 单例模式一般没有接口,扩展困难。如果要扩展,则除了修改原来的代码,没有第二种途径,违背开闭原则。
- 在并发测试中,单例模式不利于代码调试。在调试过程中,如果单例中的代码没有执行完,也不能模拟生成一个新的对象。
- 单例模式的功能代码通常写在一个类中,如果功能设计不合理,则很容易违背单一职责原则
所以一旦遇到这样的情况后,我们就必须根据需求合理的使用该设计模式,我总结了一下它适合用到的地方,一定是类不经常做出改变的,而且该类只出现一次,像登录界面的时候,就很合适用到这个设计模式。
三、创建单例模式的步骤
就只要3点要素:
- 将该类的构造方法设置为private(私有属性),这样做到原因是因为我们知道创建一个类的实例都是通过new它的构造方法,只要我们将它的构造方法设置为私有的,一般就调用不了,当然暴力反射肯定还是能够将这个破解。
- 该类本身要包含一个静态的实例,不然外界都无法new它,它就不能产生实例了,我们就没法用它,所以要设置一个它本身的静态的实例在它的里面。
- 提供一个静态的公用函数用于调用和创建该类的实例,这样外界,就只能通过这个公共函数来调用这个类了。
这三点只是实现该设计的要素,我们要怎么处理该类不会产生多个实例了,因为即使将该类的构造方法设置为私有了,但是它本身还是有一个公共函数可以创建实例对象,所以这时候我们就需要在该类中判断一下,该实例对象是否已经用完,可以设置一个专属变量来判断,它是否为空来控制是否还要继续创建实例。
四、实现代码
public class LazySingleton {
//保证 instance 在所有线程中同步(通俗来讲就是为了保障该类的实例只要一个)
private static volatile LazySingleton instance = null;
//private 避免类在外部被实例化
private LazySingleton() {
}
//getInstance 方法前加同步(该方法就是用来创建和调用该类的实例对象)
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
总结
其实没多大总结的,记住创建的三大步骤,这个单例模式就是欧克的了。