单例模式
在Java中有很多的设计模式,今天我们讲一下最简单的单例模式
如果你对封装关键字还有疑虑那你可以去看看我之前写过的:
传送门: Java的类与对象之封装.
目的:
使某类只能有一个实例化对象
定义:
一个类有且仅有一个实例化对象,并且自行实例化向整个程序提供
结合之前我们讲到的封装我们可以这样实现单例模式:
1.提供用private修饰的构造方法
2.有一个该类的静态私有对象
3.提供一个静态的共有的方法用于创建,获取私有对象
具体实现有两种分别为:饿汉式,懒汉式下面我们分别来讲一讲吧
饿汉式
所谓的饿汉式其实就是在对象创建的过程中完成实例化
class Bai{ private Bai(){ } private static Bai B = new Bai(); public static Bai Abi(){ return B; } } public class Text_0 { public static void main(String[] args) { Bai a1 = Bai.Abi(); Bai a2 = Bai.Abi(); System.out.println(a1); System.out.println(a2); } }
输出为:
home_work.Bai@776ec8df
home_work.Bai@776ec8df
输出的这个是什么东西呢?这个就和println()方法有关了我们用之前的方法按住Ctrl然后鼠标点击println看看,依次使用这种办法我们可以看到println方法最后返回了什么
可以看到它最后返回的是它的一个位置描述!!
我们这里输出了:
home_work.Bai@776ec8df
home_work.Bai@776ec8df
说明a1和a2指向的是同一个对象,说明我们的单例模式是成功的
懒汉式
在对象创建过程中不进行实例化,静态共有方法中实例化,也就是在使用时才实例化
class Bai{ private Bai(){ } private static Bai B=null ; public static Bai Abi(){ if (B==null) B=new Bai(); return B; } } public class Text_0 { public static void main(String[] args) { Bai a1 = Bai.Abi(); Bai a2 = Bai.Abi(); System.out.println(a1); System.out.println(a2); } }
输出为:
home_work.Bai@776ec8df
home_work.Bai@776ec8df
输出位置描述相同,所以我们懒汉式的单例模式也是成功的
不知道大家注意到没有这一句:
if (B==null)
B=new Bai();
这里的意思是当引用B不为空时,说明它已经指向一个实例化对象了,就不需要再次实例化了,否则会实例化出两个对象,我们的单例模式就创建失败了
所以这一步代码千万不可以缺!!!
有人可能就说了这两种单例模式看上去也是一样的,为什么还要分为两种呢?
这里说一下它们的区别之处:
饿汉式:实例化对象早,相比于懒汉式占用空间大
懒汉式:创建引用与实例化对象分开进行,所以所有时间比较长,需要用到时才进行实例化,比较节省内存
总的来说饿汉式是用空间换时间,懒汉式是用时间换空间
它们没有绝对的好坏,具体用到哪一种大家视情况而定!!!
个人理解,不喜勿喷!