00:00
我们把工厂模式这三种啊,讲的三种呢,给大家做一个小结笔记,给大家板书和梳理一下,讲了这么多,我们梳一下。呃,我们来看看工厂模式,我们讲了哪些内容哈,这个内容比较多,我们捋一捋这个思路。来捋捋,梳理一下这个思路呢,还是非常非常有用的,我们来看一下。好,我们首先讲的是简单工厂模式,还有印象哈。好,我们来捋一捋,那现在呢,我们这。插入一个分页符对吧,这叫宫。工厂模式。工厂模式。诶,这个地方应该是一。那工厂模式我们先讲的是简单工厂模式,那这边我们首先要让同学们去思考一个具体的需求,还记得吧。思考一个什么需需求呢?思考一个去这个披萨项目披萨。
01:02
订购的。就是披萨订购的这么一个项目。那么这个完成,呃,提出来这个需求以后呢,我们首先用的是传统的方法来完成,是这样子的,我们来捋一捋这个思路是怎么来完成的。看一下我们先用的是传统的方案,传统方案呢,我仍然是先画了一个类图,然后走代码,我们把这个类图拿拿过来看一下,当时我们是怎么做的呀,打开我们的eclipse,我们回顾一下。在哪里呢?在这个项目里边,我们是不是先看的factory?这里面先讲的simple,它的第一个思路。是这样子做的是吧,我们最先前是诶那个那个图好像还没有了。啊,那个图,那个图应该是相当于是这样子用的就是直接就做了这么一个东西。对不对,就这么一个思路来完成的。然后呢,我们我们就把这个图写出来,过后呢,就一个简单的一个继承,继承完了过后,我们就直接直接去定制的。
02:06
就是把这个写出来以后呢,我们是怎么做的呢,就直接写类,然后编写。编写什么呢?编写一个凹。Order pizza。点Java,然后呢,去干什么呢?去这个订购,订购需要的需要的各种什么呀,各种披萨。对,那这个代码,这个最原始的代码,我们是写到哪呢?好这个代码呢,我们就后面反正就没有用了嘛,对不对,呃,这个代码应该大体大家应该还有个印象啊,就是最原始的原始的那那个方案。呃,这个代码呢,就是后面这个是放在哪的呢,我们看一下好像。这最原始的这个已经去掉了是吧,我们改掉了啊在这就看这个地方,诶对这还有一点核心代码在这。就这一点,是不是就这一点。
03:02
好的,我把这段代码呢给大家拿过来,这是我们最传统的方式来做的。啊,传统方式来做的这样子的,那这种方式大家可以看到呢,就是有一个问题,我们对这个问题做了一个分析,做了什么分析来看一下。对这个传统方式呢,我们做了这样一个优缺点的分析,我们是这样分析的。大家看到。怎么分析呢?它的优点不用说,就是比较简单。你很容易就理解了,但缺点呢,是他违反了OCP的一个原则。对,他违反了OCP原则,主要体现在哪里呢?就是当我们给一个类增加新的功能时,对吧,我们会。动很多代码。那么在这里我说,比如说我们要增加一个新的披萨种类,比如说胡椒披萨。那么我们修改的代码就会很多。我们要修改很多代码,比如说我们要去增加一个披萨。同时还要在order。
04:05
这个披萨里面呢,在这里面加上一段代码来进行这个修改,而且就是只要哪个地方用到了,只要哪个地方用到了,我们这个订购都要写,都要对这个代码进行修改,这样是不划算的。是不是这样是不划算的,所以说这个方案呢,我们就把它抛弃了啊,就是说大致的意思,我这写一下啊,大致的意思就是这样写的就是。就是当如果我们增加一个。一个披萨。披萨类。那么只要是只要是使订购,呃,只要是有对披萨,只要是只要是订购就是。订购,订购披萨的。披萨的代码都需要,都需要修改。
05:01
都需要修改成什么样的呢?都需要在这做一个改进,这样就很麻烦。因为我们知道我们订购可能不止不止是一家,可能有很多地方都写的,比如说order披萨。有三个order披萨二,Order披萨三都有可能,于是这个改改动呢,它就比较大,所以我们这个就放弃了,那放弃这个方案过后呢,我们就提出改进的一个方案,那怎么改进的呢?来我们看一下这个思路,就是我们的第四点。对吧,我们提出了一个改进思路。那这个改进思路是这样子的。我们把披萨的类封装披萨,创建披萨的对象,对象的封装一个类里面当有新的披萨种类是只要修改这个类就可以了。那这个时候就提出了简单工厂的概念。对吧,这就引出我们简单工厂,引出简单工厂以后呢,我们就先对简单工厂做了一个基本的介绍。
06:01
是这样子的吧,我们先做了一个基本介绍,就说。简单工厂它到底是一个怎样的含义?利率我们知道简单工厂呢,它是属于创建型的一种模式。呃,它是工厂的一种一种,而且呢,它也是我们工厂模式里面最简单也是最实用的一种方式。对吧,这是说的第一点,第二点那么简单,工程的核心思想是。他将他会封装实例化对象的这个代码,或者叫行为,就是说我们去创建一个。对象的时候,他把创建的。对象实例的这个代码封装起来。封装起来就OK。好,这是我们对简单工厂的一个介绍,后面呢,我们就用简单工厂对这个代码进行了一个改进,是这样子的吧,来,放到这来。好,我们写到这儿来。
07:00
那具体来说,我们是怎么改进的呢?我们是怎么改进的呢?首先我们画出了一个示意图,把示意图拿过来。是这样修改的,拿过来,好,现在就对上了,来看这里。我们类,呃,这个披萨还是这些,然后在这里呢,我们增加了一个simple bay类。然后你如果要定要要去订购我们的披萨,就把这个simple battery这个对象呢,组合到你这个类里面就可以了,当然也可以是静态的,我后面不是说也可以用静态吗?对不对?好,这是对应的一个类图。那有了这个类图过后呢,我们的代码也就自然出来了,代码很多,那现在我就没有办法一个一个粘贴拷贝了,这样子好,同学们代码呢,因为太多了,我。我怎么办呢?我这个就没有办法一一点一点拷贝了,很难哈,那这样子我看怎么给大家拿过来哈。
08:02
嗯。怎么拿过来呢?因为代码太多,全部在粘贴拷贝一下,这也不现实,我们就把最核心的那段代码拿过来就行,好不好?第一个呢,就是simple factory,这个是比较核心的。对,这个是比较核心的,来放这儿。像一个表格,表格。好,这是第一个比较核心的类,就是simple factory。这是一个核心的类,我们再来看还有哪个地方是核心的呢?来,还有一个。还有一个就是我们在使用的时候,这一个order披萨它是怎么用的,这块比较核心。是哪里,是在这儿,大家看。我们在order披萨里面呢,去会去定义一个简单工程的。呃,这个对象或者叫一个属性,然后在这有个set factory。然后呢,别人用的时候把它设置进来就OK,好,这是我们比较重要的一个使用,我写到这里叫order。
09:02
Order pizza。点Java这个里面是用到了,好往这一粘就可以了,是吧,这是一个比较核心的类。好,这这就是最最重要的,我就其他的我就不拿了,其他的代码我就不拿了,其他的代码呢,我写到哪呢,这样子最后整体代码还要给他一份吗?还有最后这个代码呢,我我会把就是每一天的代码都会放到这里来。就是大家到时间在这去看,完整的代码,就完整的代码都在这。那我笔记里面就相当于是一个核心代码,完整的代码。啊,完整。完整代码放这。好,完整代码我们到时候会放在这个文件夹里边,OK,那接着我们继续往下来做整理,那当我们把简单工厂模式讲完了过后呢,我们又提出工厂方法模式。那工程方法模式我们是怎么引引进来这个知识点的呢?我们是这样讲的,我们说现在有一个需求。
10:06
现在有个新的需求摆在我们的面前,怎样一个新的需求呢?他说客户在点披萨的时候呢,他可以点不同口味的披萨。就说可能是北京的披萨。北京的奶酪,北京的胡椒,它不仅仅是奶酪和胡椒了,这个大的分类,它在这里面还有北京,还有伦敦,还有可能还有其他城市的,那这个时候它的分类就比较细致了。那这个时候呢,我们先谈的第一种思路,第一种思路呢,我们仍然是想到的用简单工厂模式来解决,那如果用简单工厂的模式来解解决呢,我们就会干什么呢?就会有不同的简单工程类。而且会比较多是吧,会比较多,那这样的呢,我们就不太利于我们软件的维护。维护,因为你你你产生北京的奶酪啊,那就是就一个北京的胡椒,又一个伦敦又一个,那太多了啊,太多了,这样不合理,所以说我们提出了第二种方式,就是什么呢。
11:09
工厂方法模式。那提出这个工厂方法模式以后呢,我们就对工厂方法模式做了一个简单的介绍,就是何为?什么是工厂方法模式,对吧,我们提出了这么一个需求啊,工厂方法模式。下面有两点需要同学们知道。第一点。第一点就是。呃,工厂方法模式呢,是定义了一个创建对象的抽象方法。子类。决定如何实例化。子类决定实例化,也就是说我们把什么呢?把对象实例的,呃,把对象的实例化推迟到子类去完成,这是它的核心思想。好的。当我们明白。工厂方法模式以后呢,我们就对这个代码进行了一个改进,来我们来分析,我们把这个代码给它改进,改进的代码给他拿过来。
12:07
走一下。这是他的应用案例。第一个。对。那么思路分析我也拿过来了,思路分析代码思路分析我们直接把这个类图拿过来就可以看到了,这是工厂方法模式,来看一下。我们这样改进的还记得吧?把这个图截过来,大家一看就明白了。怎么改进的呢?诶,我们相当于把这个order披萨看成一个。工厂一样,里面呢有一个create披萨,但这个方法呢,在这里没有实现,交给他的子类。去实现。此类。各个这个子类去跟自己的相关的披萨进行一个依赖,好是这样子来进行设计的,好这是我们的。这个示意图,那有了这个示意图以后呢,我们就把代码也给同学们写了一把,具体代码呢,也比较多哈,我仍然是找最核心的,哪一块最核心同学们看。
13:10
是不是在这儿?首先我们做了一个抽象的类,是order,披萨里面呢定义了一个抽象方法。这个create披萨呢?我们要求自己的工厂子类自己去实现。于是乎,我们就。写到这里来的,插入一个表格。好,我们先写到这,这是我们的order披萨。点Java这个类。对吧,那紧接着怎么它它的一个子类是怎么写的呢?我就找一个就行,比如说北京的。北京的order披萨,它的代码呢,就是去实现order披萨的这个抽象方法就可以了,好,我把这段代码写到进来。很简单对不对,这边是我们的这一个北京。北京的一个order披萨。
14:02
那同学们。伦敦也是一样的。伦敦根据自己的情况来。决定返回怎样的一个披萨实力,我说我把这个呢也给同学们放过来。好了,那用法其他都一样,我就不再写了,这是我们简单啊,就是工厂方法模式的一个一个整理梳理好,代码也在这。当我们把。工厂方法模式讲完过后呢,我们又讲了抽象工厂模式,对吧。那抽象工厂模式我们是怎么讲的呢?仍然是先。先给同学们做了基本的介绍,我们捋一下这个思路。我们来回顾一下抽象工厂模式是什么?它是定义了一个interface,用于这个interface里面呢,有用于创建相关或有依赖关系的一个对象处。
15:01
然后呢?干什么呢?这个工厂就是抽象工厂呢,他把工厂抽象成了两层。是不是两层呢?一层就是我们的抽象工厂。一层就是我们具体的工厂子类。工厂之类。呃,然后呢,我们可以根据实际情况。来把这个简单工厂,我们跟把这个简单工厂去继承我们,呃或实现我们这个抽象工厂。然后通过这个接口,让我们的这个客户端去依赖具体的一个工程之类。好,这个类图大家看一下,类图呢?是在哪画的?打开我们的eclipse,其实是在这里画的。是吧,也就是说格式你会发现呢,这个它跟工厂方法不一样的地方就是唯一不一样的地方就是它多了,把这个工厂分成了两层。
16:01
对,分成两层。把这个工厂呃,模式呢,分成两层,这样子呢,就有一层是抽象层,有一层是具体的实现层。具体的时间层,OK,我把这个呢给大家拿到这里来,这是它的一个类图。好,放这就可以了。放这就可以,那么工厂模式这说完了以后呢,我们就干什么呀,我们就用工厂这个模式,工厂呃,抽象工厂模式继续改进了我们的披萨项目。继续改进的P的项目,好的,我把这写到这儿,嗯,那么核心代码在哪里,我们来看一下,仍然是在order这一层。使用这块其实大同小异是吧,就说这个披萨本身这一块呢,大同小异,我们来看这张代码。这是披萨,呃,是在这有一个。抽象工厂的。这个接口这一层,我把它呢拿到这里来。代码放过来。
17:01
对不对。然后我让什么呢?我让不同的。工厂子类去实现这个接口。是这样子的吧,实现这个接口,还有一个我也粘贴复制过来,是哪一个呢,伦敦。啊,伦敦。伦敦的工厂呢,也去实现了这一个接口。使用这就不多说了,大家看使用的时候呢,我们又变成用alder披萨去使用,Aler披萨使用的时候呢,它这里面有一个属性,就是我们抽象。工厂的这个接口。那既然是接口,我就可以去接收什么呢?接收它任意一个实现的子类,这样就比较方便了。好,我把这个呢也给大家拿过来,这边是order。Order pizza。点Java没问题是吧,放过来就可以了。好的,嗯,那这个披萨store我就不去处理了。
18:01
抽象工厂就说到这儿了,说完了以后呢,我们又做了一件什么事情呢?我们说工厂模式,其中有我们找了一段源码,让大家看到在源代码里面也会用到工程模式,最经典的呢,就是JDK里面有一个canon,就是日历类。这个日历类呢,它就用到了简单工厂模式,好,我们把这个呢给各位朋友板书到这里来。对不对。好,我们来一个标题。在这里呢,它有两点,我们整理一下即可。整理一下即可。第一个。这首先抛出来一个话题,就是canadaend用到了简单工厂,下面呢我们做了源码分析,还有这个debug源码进行这样一个分析,我们看源码。源码分析是怎么分析的源码?源码部分。源码部分呢,同样我们来一个这样的小箭头,对不对,小箭头我们注一下。我们来注意一下,首先呢,我们看到在这个使用的过程中,我们先看的是这个类。
19:08
啊,先看的是这个类,就说这里面呢。Calendar有个great。Canada有个get instance,然后呢,在这个get instance里边,我们注意到这里面呢,同学们可以看到。它这里面有一个方法。就是这个把这个方法我们拿过来。诶把这个拿回来,这是在哪里呢,在开。Calendar。点Java里边是不是有这么一个方法,这个方法里面呢,大家看到核心是在create calendar这个方法中,那这个方法我们再追一下。诶,大就这段代码。是吧,这段代码,这段代码呢,根据用户在创建的时候,在创建can的时候呢,根据它的输入不同,然后呢,决定是怎么做的,大家看这里我们是在这啊就根据什么呢。
20:04
根据这个在创建时。创建我们C的时候传入的这这些值不同,根据。根据这个时区啊,根据zero,还有我们的local。No。ACA来创建。创建对应的实例。是吧,核心代码在哪里呢?这还有一段代码就是if这块语句,你看同学们看这里面呢,它根据你不同的情况来调用不同的创建方法。返回对应的这个日历实例。那有兴趣的同学呢,可以往里面再去追一下,我这里就不去追他了。好,这是我们对源码的一个说明。对源码的一个说明,那下边我们最后呢,还对这个工厂模式做了一个小结,对吧?对工厂模式做了小结,就说呃,工厂模式的核心思想是什么,工厂模式小结OK。
21:15
放这来就可以,那具体来说,我们首先说了工厂模式的意义。它的意义就是能够把实例化对象代码提取出来,然后统一管理,这个类其实就是我们的工厂类。那共享模式呢,一共有三种,这这也需要有一些印象。在工厂模式里面呢,它体现出来一个就是依赖抽象这么一个原则,对怎么依赖的呢?就在这一个我们体现出来了。OK,好的,那关于这个工厂模式的一个梳理,我们就到这里。
我来说两句