00:00
工厂模式,他在我们JDK的有一个类里边叫calendar calendar是一个日期。是吧,它是一个日历类,这个日历类里边呢,它的源码里面,它就使用到了我们的工厂模式的简单工厂。它使用了我们简单工程模式,我们来看一下,我们来看一下这段代码它是怎么使用的,呃,前面这段代码我就我就拿过来用一下好吧。我就不写了,那么大家看到我在eclip里面创建一个新的项目叫JDKSRC,那么我们关于JDK源码的追踪呢,就在这个项目里面去写明白。好,我新建一个类。然后在这个类里面呢,我们来看一下我们来calendar它是怎么使用。这一个工厂模式。来完成获取一个实例的,好吧,这段代码呢,我就直接拿过来用,引入我们相关的包,同学们看。
01:02
这段代码呢,我们追一下它的源码。Calendar,大家看calendar这个地方呢?他这里同学们有没有观察到它是调用了一个get instance。这个方法,那么我们可以看到这个calendar呢,他在这方调get instance是直接通过类名来调用的,因此我们可以判断是一个静态方法。也就是说这个get instance是什么呢?是这个calendar的一个静态方法。对吧,我们现在追到这里面去看他是怎么创建的。Open一下。那追进来以后呢,我们发现他在这里。在这一个get instance里面呢,它调用了一个create,看里面它根据什么呀,它根据你的时区,还有你的一个地区来返回一个10亿,那么我们再往里面追。
02:02
我们再追一下get calendar,它是怎么跑的呢?往下看同学们。哎,同学们有发现,他这边先去获取一个provider。根据什么呢?根据。呃,根据这个Canada provider的,那还有一个你传进来的local。来获取一个provider,如果这个provider呢,不等于空它去调用provider里面的get instance,那么我们注意看下边。否则的话呢,大家有观察到。他在这里判断我们这个no卡的一个这个罪。然后呢,根据不同的情况,大家看这里它用的Switch语句,如果是这样一个值,它调用的是这个创建方法,如果是这样一个值,调的是这样一个方法,用了一个这样实例是吧,他把创建真正的实例呢,是放在。
03:01
这个地方去的,实际上这就类似于我们一个工厂方法。根据什么呢?就是根据你传进来的不同的值,我给你返回不同类型的,看对象实例是不是非常像我们的。前面我们讲的根据你订餐,就是你要。订购的这一个不同,不同的。呃,披萨,我给你返回不同的。这一个披萨实例是不是很像啊,诶那么最后经过他这一般处理呢,最后它返回这个canadaalend,这个C是在这定义的,看到没有,如果你没创建成功,那最后返回的就是个空。诶,同学们看,根据这段代码的追踪,我们其实可以看出来,它就用到了我们这一个简单工程模式,好,我们可以来追踪一下这个源码,我们debug一下,看看它是不是这样执行的来吧。我在这里下一个断点。同学们,我在这里下一个断点,因为我在这里呢,没有传,没有传这个时区还有这个地区的信息,那么它默认使用一个,他使用默认的方法来给你返回一个C的实例,我们追踪一下。
04:12
Debug。8UG以下来各位同学,我们往里面追。看到get instance我最精确。对,那追进去我们发现呢,它调用的是create calendar,我们再往里面追。好,再往里面追。这个时候我们应该。追到这里面去。好追到这里面去呢,它返回一个默认的一个时区返回来,然后再调用什么呀,因为你没传嘛,它会再去调用这个no卡的一个get in default这个方法。接着再往里面追一下。你看他这个时候调的谁啊,调到这来了,Get一个deat,默认的一个local,然后我们再返回,返回过后呢,这次再追进去,它调用的就是create calendar追进去,诶同学们看到追到这来了。
05:02
那追到这里来了,过后呢,我们往下走。走诶这个时候provider他就拿到了provider,因为现在不等于空,不等于空,他就进到这里面去了。对不对,因为这个时候他是根据你的,呃,这个默认的方式拿到一个provider,那是他追进去,追到这里面,他通过provider里面的get instance返回了一个calend,那同学们可以看到下面的代码,如果我们这个whether它就等于空,会怎么办呢?那就走下面的代码,那就根据你传入的这个local卡的信息来返回不同的一个开人的实例。这就是一个经典的简单工厂模式的使用,大家看是不是这样子的,哎,我们通过一个最源代码呢,我们就看出来了这样一个啊,这样一个信息,看这个流程第一步首先要get instance。调概的意思认是呢,会去调用我们calend类里面的这个静态方法,在这个静态方法里面呢,它又写了一份createz kindend,哎,这个就是我们。
06:09
原先那个类似的产生生成一个披萨的实例的方法,然后他在这里呢,根据你不同的情况。就是相当于说我们在订购披萨的时候,根据你的。订购的类型,我给你返回不同的这个calendar是不是,你看是不是这样的一个情况。下面是不是都写的有啊Switch啊,这里有分支判断如果怎么怎么样,又怎么怎么样,最终呢,返回一个看。诶,这就是他的一个经典的应用场景。这就是我们经典的一个场场景,OK,嗯,那我们接着再来对这个工厂模式做一个小结,做一个小结我们来看一下工厂模式有哪些地方需要同学们注意。首先我们看工厂模式的意义在什么地方,它的核心思想是什么?将实例化对象的代码提取出来,你可以这样想,比如说我这有一个有一个对象叫A,叫披萨吧。
07:07
披萨。那么假如我们这个A类。要去创建披萨对象实例,假如我们这个B类也要去创建披萨对象实例,假如我们这个C类也要去创建披萨对象实例,那如果你每个地方就让ABC直接对着这个披萨,就直接依赖这个披萨的话呢?这样就出现一个问题,当我们这个披萨类型。增加或者变化时,你每一个客户端都会发生变化,于是乎他怎么做的呢?它是这样子的。哎,怎么办呢?他说你们不要这样做,你做一个工厂类核心思想啊,工厂内。然后这个工厂类里面呢,有一个。返回一个对象实例方法,然后把这个工厂类给你,对那以后要变化,我这个工厂类一变化,你ABC的客户端不需要发生任何变化,也可以去获取新的不同种类的披萨对象实例就是这样一个核心事项,好的,那么他将他是怎么做的呢?他将这个代码抽象出来,放到一个内中统一管理,达到和主项目的依赖的一个解耦。
08:22
从而提高我们项目的扩展和维护性,那这里呢,我们讲到工厂模式一共有三种,回忆下第一种简单工厂模式。也叫静态工厂模式,第二种叫工厂方法模式,第三种是抽象工厂模式,这个必须答的上来哈,这这三种是必须要有印象的。再回忆一下,一个是。什么呀,叫简单工厂模式?对不对,还有一个工厂方法模式。工厂方法模式,还有一个是什么?抽象工厂模式。
09:04
啊,空抽象工厂模式是这样子的吧,就是这么三种,对,然后呢,它这个地方一定要注意,设计模式里面有一个叫依赖抽象的原则,这在前面我们我们已经提到过,就是我们尽量去依赖抽象的东西,而不要去依赖细节的东西,你看在这个地方我们体现出了三点,在创建一个对象实例的时候,我们并没有直接六一个对象。也就是说,比如说我这个A类。我要用到一个类,比如说披萨。你们有没有发现我们并没有在A直接六,对吧?我们尽量要避免这种行为。而是把六的这个动作呢,放在一个工厂类里面。放在一个工厂里面,那并返回,有的书上把这种行为叫什么呢?叫做变量,不要直接持有具体的引用。就是说我们在这个A类要用P上呢,往往我们是通过一个工厂类给他返回来这个对象实例,那这样有什么好处呢?这样相当于说我依赖的是一个抽象的,或者依赖一个缓冲层。
10:10
那这样子呢,对我将来要有什么变化,我直接问这个工程要就行了,就这意思,好,你看在这里不要让类继承具体的类。而是让类聚成一个抽象类,或者是驶向一个接口。大家还记不记得。我们在写这个抽象工程的时候,我们这个抽层是一个接口,对吧,第三点我们在做这个,呃,开发的时候,在工厂模式的时候呢,不要去覆盖机内中已经实现的方法,大家还记不记得我们写了一个接口。就是抽象工厂模式有个接口,那个是一个抽象方法,是让具体的子类子工厂去实现的,好,这就是我们依赖抽象原则的三点,大家要有一个印象,那这三点呢,其实在我们工厂模式里面,尤其是抽象工厂里面,抽象工厂模式里面都体现出来了。
11:03
好的,同学们,那关于我们这讲的工厂模式在jdk cend这个类里面应用的源码分析,以及工厂模式的一个小结就给大家讲到这里,大家要认真去体会。
我来说两句