1.前言
java中创建一个对象是需要消耗内存的,当我们无休止的创建对象就会造成内存不足,并且很多对象我们使用一次就不使用了,或者是在特定的场合才需要创建一个特定的对象,有没有什么好的方式可以帮助我们满足以上需求呢?这就是我们今天要介绍的单例设计模式。
2.单例设计模式
单例设计模式分为两种,一种是有需要才创建,另一种是不管需不需要都会创建。前一种我们称为懒汉式,后一种称为饿汉式。
2.1、饿汉式
活不多说直接上代码:
从图中,我们可以看到,创建饿汉式分为三步骤:
1.私有化构造器
2.在类的内部构造一个对象
3.提供一个类方法,可以使外部直接访问这个已经创建好的对象。
这个内部的对象是以static修饰的,由前面的知识,我们知道,static修饰就会随着类的加载而加载,因此这个对象在还没有实例化对象的时候就存在了,所以我们说它是不管我们需不需要都会创建的。
2.2、懒汉式
从图中,我们可以看到,创建懒汉式分为三步骤:
1.私有化构造器
2.在类的内部提供一个对象
3.提供一个类方法,如果当外界使用时,对象不存在就创建否则就直接返回已创建的对象。
懒汉式的内部对象也是用static修饰的,但不同的是,我们没有给他提供一个对象引用,也就导致了对象 == NULL。因此这就是不占用内存的原因。并且只有当我们需要的时候才会创建对象来提供给我们使用。
2.3、区别
至于什么是线程安全,我们在后面会仔细学习的!!
3.final关键字
如果我们希望在java中使用常量该怎么办呢?final关键字就来帮助我们了。
使用场景1:不希望类被其他类继承
使用场景2:不希望父类的某个方法被子类重写
使用场景3:不希望类的某个属性的值被修改
使用场景4:不希望类的局部变量被修改:
4.final修饰的属性
对于final修饰的属性,对于他的赋值是有要求的
4.1、final修饰的非静态属性
4.2、final修饰静态属性
为什么不能在构造器中赋值,这个问题我们已经讲了很多次了,因为static修饰是要高于构造器的,随类的加载而加载的。因此不能在构造器中赋值。
final修饰静态属性有一个好处,是不会引起其他静态属性的执行。
5.结语
今天就讲到这里了,后面我们将讲述抽象类以及接口的概念!谢谢观看