00:00
各位,我们来看设计模式里面的第一个,也是同学们以前接触过的设计模式,叫单利模式。那单利模式是什么呢?我们做一个简单的介绍哈,单利模式,所谓类的单利模式设计呢,它是采取一定的方法。保证整个软件系统中对某个类只能存在一个对象实力,就是说它从设计层面,注意听,它是从设计层面保证我们这一个类呢,只能产生一个对象实例。产生一个事例,好,那并且对该类只提供一个获取其对象实例方法,当然这种方法一般是静态的。对吧,这种方法我们是静态的,静态方法。好,嗯,那比如说同学们,呃,在里面有一个session factory。它里面就是充当数据存储源的代理,那么并且负负责创建一个session,这一一个session factory,它。
01:05
是一个重量级的,一般情况下项目只需要一个就可以了,也就是说在hi里面呢,这个session factory,它就是一个单立模式。那现在呢,我们来看单利模式,呃,在我们开发中,一有几种写法,同学们可以看到,在我们实际开发中呢,单利模式一共有五种,二汉式有两种,懒汉式有三种。然后呢是双重检查,静态内部类和枚举,我们分别给大家介绍,我们先介绍二汉式的两种写法,来同学们看一下。那么二汉式的第一种写法是利用我们静态常量来完成的,它的基本步骤是这样子,先创先让我们构造器私有化。私有化的目的是干什么?同学们就是这个私有化的目的就是防止。防止这个六,就是你不能通过六来得到一个这样的对象实例是吧,然后呢,在内的内部创建对象。
02:04
就是因为没有六了嘛,那我肯定对象的实例呢,是在内部创建对外暴露一个静态的公共方法叫get instance,通过这个方法呢,我们可以返回一个该类的对象实例,下面我们用代码实现一把,来同学们看。好,OK,那现在呢,我在这儿新建。新建一个包。这是单利模式对吧,点single。好,这是第一个,那么首先我们建一个纸包,这个包呢,我们叫第一种写法。第一种写法叫TYPE1,好吧,这是我们第一种写法。OK,那现在呢?我们在这建一个类,同学们看上我的思路,我们就叫single。Tom。这是第一种写法嘛,我们就写个一好吧。就写一个一没问题,写个一。写个呃,写个test test第一个写法零一。
03:01
OK,这是我们第一种写法。那么这种写法呢?是二汉式写法,我们来看一下,我们先完成二汉式。二汉式用我们的静态。静态变量来完成的,那我现在开始写了哈,Class single,这是一个类。那这个类呢,首先我们第一步先将构造器怎么样私有化。私有化,这个很简单,Private。那么,这是一个新痛。然后这边呢,里面不用写任何东西,就私有化,别人就无法六了,就防止六。这样你私有化了,就外部外部不能六了,是不是,那不能六怎么办呢?没问题,我们现在呢,给它来一个静态。我们在这里在第二步,我们我们写到这吧,好这写到写到这儿也可以写到这儿干什么呢?在本类,本类内部内部我们创建一个对象实例,怎么创建呢。
04:05
Private OK final,我定这个final类型,Static,这大家都学过的,Single就是我们这个类哈,我们这个类它有个实例,我们叫instance。等于直接溜一个心痛就完事了。那也就是说我们上来过后呢,在这个类的加载的时候,我们就创建这么一个对象实例,那对象实例你看这都是私有的,那我怎么返回呢?OK,对外提供。提供一个公有的静态方法返回。返回什么?返回实例对象即可,怎么写呢?非常简单,Public,我static。返回的实例对象的类型就是simple,那就写个get in,使ten没问题,然后直接return即可。Instance干嘛就想了?我们待会再分析它的优,还有它它的一些存在的问题和他的他的优点和他缺点哈,那我们试用一下测试。
05:08
那测试很简单,我们六,我们就不能六了啊,不能六,直接用single to.get instance我们就拿到了它的一个实例。就拿到了,假如我们用这个singto再去拿到这样一个实例,我们发现这两个实例是相同的,我们来测一下。怎么来证明这两个实例是相同的呢?我们用等号双等来判断。同学们看。这两个哈,虽然你是调用调用了两次加载instance,大家看你第一次调用的时候,你在你在用这个类的时候呢,它就会加载这个类,加载类的时候,这个我们的instance对象实例就创建起来了,那你第一次调用get instance返回的是这个实例,你第二次调用这个get是不是还是返回这个对象实例了,因为所以说这个地方就应该为触。
06:03
我们运行时,我们发现呢,的确。各位,我们发现的确它是一个错,没问题哈,那现在我们还有一种方法来证明这两者是否怎么整呢?同学们看,我用instance点。它的把它的哈希code打出来,你会发现呢,这两者哈希code也是相同的。走一个,我们instance code输出等于加。第一个我们再看第二个instance。把它的哈希code也输出来,你们注意观察这两者,这个对象的哈希code它是相同的运行值。OK,同学们可以看到。同学,看是不是相同,都是这个值,那说明这两个对象实例其实是同一个对象实例,那么我们就通过这个二汉式的静态变量完成了第一种写法。
07:01
第一种写法OK,那第一种写法呢,我们就先叫着第一种写法,有什么问题我们来分析一下,那我们看一下。优缺点寥寥。那同学们看二汉式的静态常量方法写的优点当然不用说了,比较简单。因为它在内装载的时候就完成了实例化,它就避免了线程同步问题,也就是说在我们装载内的时候,我们这个实力就拿到了,因此没有现成这个多线程的问题。没有多线程的问题,但缺点是这样子的,在内装载的时候就完成的实例化,那就没有达到我们的懒加载的效果。那换言之,就说如果从始至终没有用过这个实力,就会造成内存的浪费,什么意思呢?就说我们有可能没有用到这个实力,但是你也有可能把这个实力就创建起来了。为什么呢?因为他是在内装载的时候就完成了实例化。
08:01
这句话我再做一个解释啊,用第三点再说,这种方法它是用内装载的机制,避免了多线程的同步问题,不过注意听这句话啊,是在内装载的时候就实体化了。在内装载的时候就实际化了,那什么情况下会发生内装载呢?这一点就跟我们Java基础有密切关系,我说一下我们导致这个当然,呃,首先我说啊,如果如果我们调用get instance这个方法肯定会。造成这个内装载这种是正常的,因为我们get一个实例回来,他完成内装载,我们就用它,这个是OK的,在这点是OK的,但是注意听这句话,但是但是我们。我们导致这个类装载的原因会有很多。因此不能确定有其他方式。或者是其他的静态方法导致我们这个内装载。
09:00
也就是说,如果你只是你刚好就是通过这个get instance导致我们这个single to single to这个类进行装载,然后完成实际化,这个是OK的,但是呢,你不敢保证。就只有这一个方法才导致类类的装载,因为类装载情况很多对吧,他不能他可能是其他方式导致,那这样子的话呢,我们这个instance就创业了,但是你还没有用它。这样就干什么呢?这个懒加载就没有意义了,那懒家就就没实现,因此我们这个最后这个结论是这种单利模式是可以用的,没有任何问题,但可能造成内存的浪费。那浪费还还不算什么大事儿是吧,就是说你说我浪费一个就浪费一个了。这这也说得过去,但是呢,我们如果能不浪费不是更好吗?说这种方式呢,在什么呢?在没有在,就是你确定好,就是说你一定会用到它,那这个就没问题,但是呢。如果你装载了又没有用,那就造成浪费了,所以说我这写了一句话,可以用是没有问题的,因为它没有它大,就是没有实现难加载,但是呢,对程序本身它不是不会有有什有什么问题。
10:13
撑死了就是造成一个内存浪费,所以说可用可用,但是呢,可能造成内存浪费,好这个就是我们二汉式的第一种写法,叫静态常用的写法,我就先讲到这里,最后代码呢在这儿。在这OK,关于。二汉斯的第一种写法,我们就聊到这里。
我来说两句