00:00
来打开我们这个幻灯片,下一个聊的是这个话题,抽象工厂模式。那么抽象工厂模式,它是怎么去搞这个创建披萨店的这个披萨的呢?他是这么设计的,大家看先看定义,它首先定义一个treat。那么如果在Java里面就是一个接口,它的一个缺点里面用于创建相关或有依赖关系的对象,除。而无需指明具体的类啊,就是这个,它是定义的这个,那么抽象工厂可以将简单工厂模式和工厂方式整合起来,这个就是它的比较厉害的地方,就说原先这两点都有缺陷,那么我的这个抽象工程模式呢,就把两者。结合起来了,所以说抽象工厂呢,在我们开发中用的。更多一些,那它怎么整合的呢?大家看,从设计层面上,抽象工厂模式就是对简单工厂模式的改进。
01:02
或者称之为进一步的抽象。就是刚才我说的,因为你现在指的太多了,但是我又不想下层,我又不想搞那么多,怎么办呢?他这样搞的,他将工厂抽象成两层。抽象成两层,一类呢,叫抽象工厂。抽象工厂叫upside factory和具体实现的工厂此类就说我我我这个工厂原先太多了,我抽象一层出来,将来你有些常规化的工作就交给这个抽象工厂去做,具体实现的呢,可以交给这个子类去做,程序员可以根据创建队形类型使用对应的工厂子类,这样将简单的工厂就变成了一个工厂组,就是有很多工厂了,而且在管理你原先那个。原先那个就是我的第一个方案,见到很多工厂他没有关系,也不好,现在有一个抽象工厂管理你们,哎,这也是不错的,好,这是他的一个精品介绍,那下面呢,我们二话不说,直接上代码啊。直接上代码看工抽象工厂它怎么玩的呢?好,首先看代码,还是以刚才这个披萨店为例。
02:09
首先。他在这里呢,先做一个抽象工厂的一个trade出来,里面声明了一个qui披萨这么一个方法。那么我自己不去做,然后下面呢,我有很多的这个工厂去实现你的方法,比如说。北京工厂。去实地化,那么就创建北京的披萨,各种披萨如果是伦敦的工程呢,就去实现你的这个重建工程,去创建我们伦敦的。胡椒披萨或者是什么披萨?好,这个是一个改进,第二个改进呢,也在使用上做了改进,大家看我们在定披萨的时候呢,我就不再。区分你是订伦敦的还是订这个北京的,不,不需要了,为什么?因为你的工厂已经可以明确出来你是要订哪里的。
03:04
OK啊,当然你看我的代码就显得比较简洁了,我是这么做的。反其道而行之,原先是把这个类型,大家看这段代码啊,非常的有意思,原先我们创建一个对象,我们是拿到。给我传一个type出来,现在我反过来了,我要创建一个,我要去订购一个披萨,你给我传一个工厂进来。就反过来了。你给我一个工厂,那么我不管你这个工厂是什么,我把这个类型传给你,你就自己知道应该给我。创建北京的胡椒披萨还是伦敦的胡椒披萨?因为你的工厂已经明确知道你是哪个地方的工厂。啊,这个思想我觉得还是比较牛逼的啊,他这个思想呢,就是大家慢慢去体会啊,这个思想还是比较有意思的,就是说将来我们去创建一个。
04:01
订购一个披萨怎么呢?Orderder披萨,仍然是order披萨,然后呢,你如果要创建北京的,那就直接给他扔一个北京工厂。如果你要去订购这个伦敦的,就留一个伦敦工厂就可以了,诶这样子呢,就显得更加简洁对吧?反过来用好这个呢,我认为还是不错的啊,那同学们,我们对上面的代码进一步的改进,改进成我们抽象工厂模式,好同学们打开这个地方,我们来玩一把。好,同学们,那我新建一个对不对,新建一个包,那么这边我们就叫abstract。Abstract,然后什么呢?呃,抽象工厂factory。好,写完了。那老规矩啊,因为时间关系呢,我就从这个这方直接粘一份过去,为了有一个分层的概念,我先建一个测试人类。好,然后我就往里面扔东西了啊,就在这个这个披萨上面改吧,就那个就在这个抽象方法上面去改快一点,复制一下,然后直接扔到这边来。
05:08
粘贴一下。好的好,粘贴完了过后呢,同学们看啊,我们要改进的地方呢,其实像这个北京的奶酪披萨和北京的胡椒披萨就不用动它了。不用动它了,那么这个地方呢,我们要改进成非抽象的,OK,好,这个就。补一下,因为我这边就的的确确整个思路就发生变化了,对吧,那么现在先这样子啊,我们先把两个工厂搞出来。啊,我们先把,呃,先把这个整个这个工厂,那这个地方它整个思路就发生变化了,那这个就没有意义了啊,北京订购的这个已经没有没有用了,删掉了。备用了,因为它不在下沉。那怎么做呢?好,这个地方我们写第一个啊,就是北京的工厂,那先写一个抽象工厂类出来。是一个寸理解思想啊,同学们。
06:03
慢慢领会它的好处。阿巴斯这个factory。抽象工厂是一个treat及一个接口,对,那这里面呢,我们有一个方法时间关系啊,我拿过来用一下,就是刚才我们写的这个玩意儿啊。抽象的。这个地方没有实现啊,没有实现代码有空的啊,但是这个披萨我还是要要的啊,披萨就这个里面就进去了,那紧接着在这个抽象工厂之之这个基础上呢,我们创建各个地方的工厂。呃,首先我来建一个北京工厂。北京。北京的一个factory。Factory,那么这个工厂呢,他要去继承,继承我们那个抽象的这个工厂,当然这边肯定是有方法要去实现了,哎,那具体来说你怎么实现呢?好,那就是具体的给它做完啊,啊现在这段代码我也不去写了啊,直接把这个北京工厂这段代码拿过来用一下就可以了。
07:05
好看一下。就说到时间北京工厂就创建北京相关的啊,这些一个披萨啊,同学们看一下啊,这个我就整个复制吧。披萨好,这个地方我们取下啊,取下好。写代码。老地方,我们要饮下披萨咯。对,饮下我们自己的披萨,然后呢,北京有奶酪披萨。啊,北京有胡椒披萨,好可以了。那现在相当于我写点注释啊。做。啊,就是看什么呢,这是一个实现了啊,这个抽象工厂的一个子工厂。的一个子宫厂的。一个子。工厂内。啊,如果将来我们要去,呃,再去北京的这些披萨呢,就找他就行了啊,就说如果啊干什么呢?哎,这样子的如果,如果我们希望希望订购订购北京北京的披萨,我们叫他。
08:13
就使用这个工厂就使用该。工厂内。工厂之类即可啊,这就分开了,因为我这个逻辑呢,就是直接写的,当然将来改动可能很多啊,就是说你这只是披萨嘛,可能北京披萨和这个,呃,北京的披萨和伦敦披萨,人家在订购的时候可能打折还不一样,对吧,北京披萨,那这就可能是打一个五折,或者你你你从伦敦运过来还有很多逻辑,这样他就有可以加很多逻辑里面去,为什么要分开,如果仅仅是看这一段,大家可能没有感受到有多好啊,因为差不多嘛,好像把代码复制一下,但是将来肯定有。不同的地方,不同的店还有折扣,还有还有不同的这个业务逻辑等等等等,你可写进去。好,这次北京工商我就写完了啊。那北京工厂写完了以后呢?伦敦工厂我就不去建了,大家照这个思路整一个伦敦工厂就行了。
09:06
好,那这个做完以后呢,我们这个工厂就做完了,我们现在怎么用呢?用的时候大家看啊,这个思路会跟原先不一样,整个思路变成什么呢?我去创订购一个披萨市,你给我传一个。这个工厂当然我我是以抽象工厂来接收的,因为你将来传的可能是北京工厂,也可能是伦敦工厂,所以说我这用的是一个abstract特质来接收,体现出他的多态。体现出他的多态。这个大家应该能看懂啊多。多肽。诶好,那具体来说,你看拿到一个工厂,我就主要看这句话,我用这个抽象工厂的这个名称,调用他的这个create披萨传进去,因为是多肽嘛,所以说我去用它方方法调我此类实验的create方法也是可以的。好,这种代码我就不去写了啊,时间关系我就直接拿过来用一下就完事了。
10:02
呃,特别简单,就是在上面稍稍的改变一下就行了。好,那我找到这个order披萨,原先是抽象的,不,不再是抽象的,不要了。好,我要做点注释啊,这个地方。原先是工厂啊,方法就不要了,我就直接扔过来,我做点注释,同学们啊,首先呢,我把这个引一下啊,引入我们的这个写完了,那我格式化一下,我做点注释。那这个时候这个order披萨,它是怎么去去订购一个披萨的呢,注意。当我们。当我们使用。使用这个抽象工厂后。抽象工厂模式后。哎,工厂模式后对不对,那么我们创建或者订购啊,叫订购一个披萨,思路是这样子的。
11:03
他的思路。实际上第一步。就是你先,你就说你给我扔进来一个工厂,我就按照你的这个工厂的方式去给给他订购一个披萨。当然,你里面的逻辑是什么,取决于你团建工厂你是怎么制造的。好,所以说这里我就接收一个什么呢,我就接收。我就接收一个工厂,子工厂吧,叫子工厂的实力。啊子工厂的实力啊,根据根据该工厂的。根据根据该工厂的一个创建要求去实化。去实体化,至于你,你让我怎么实例化,我我不管。你只能去实现,那就是你的事儿,好,现在我就改了一下啊,这个就使用的是,呃,这个就是抽象工厂模式了啊,这里写的是对的啊,抽象工厂模式。好,你看我们这个代码啊,就我自己备课的时候是一行行写,也挺累的,就要就要现场写的话,就讲到这就就要讲很久啊,没有必要,所以说我这呢,直接把代码拿出来给看一看,来跑一下吧,这个order披萨这边就很简单了,它就这么创建创建哦,在我们披萨店怎么去买买买披萨呢啊,只能这样这样买了啊。
12:21
所以你将来要买披萨,你就六,我就还是order披萨。但是这边呢,你你要买北京的,那你就用北京的工厂。北京的一个工厂传进去就可以了。至于里面人家怎么做的,那就是人家的事儿啊,你要买将来你说哎,老师我想订购的不是北京的,我要订购的是伦敦的,那你就伦敦的一个factor。啊,伦敦里面的逻辑是什么?按照伦敦走,只是我这个没有写,同学们晚上自己加进去。好,时间关系,我们有没有写了?啊,这个肯定扩展性是非常好的,你们放心好了,来走一个跑起来。好,我们看看此时此刻这个北京的呃工厂能不能对应呢?诶,我们跑一下吧。
13:06
好,我们运行起来就说现在使用的抽象工厂模式啊,大家一看传的是北京工厂,我就随便写一个,比如说我要订购这个Greek,就是希腊的。那肯定是北京希腊工厂啊,北京西,咱么说北京这不不写这个北京奶酪还说的过去啊,北京奶酪披萨,那么我们再订购一个北京的胡椒啊,北京的胡椒PE啊,反正我不喜欢吃胡椒的。啊,我小孩喜欢吃胡椒的,你们喜欢吃胡椒的吗?啊,不喜欢啊,你们都喜欢吃奶酪的是吧,甜啊好甜好,如果说我不订购了怎么办呢?我就拜就走了,我不我不订了,拜啊走了啊这就是,那么如果说你现的是伦敦,就按伦敦这个方法,我感觉还是比较巧妙的啊,大家领领会一下它的一个妙用啊,他要你要听懂呢,你就觉得这个很好,你要听不懂,你感觉不是韩老师讲什么来着了,对吧?啊创建一块北京披萨,就听到两个字,披萨,披萨对吧,好像没有讲什么东西似的,尽讲披萨,那么不是这个意思啊,大家去领会它的好处,其实你要。
14:11
哪怕就是没有全部听懂,你也应该感觉到,就在创建对象这一块,他确实是想了很多思路的,这个就是创建型的模式,他专门解决这个问题。好了,那么关于这个抽象工厂模式呢,老师就给大家讲到这儿,我们把这个工厂模式做一个小结啊。小结,那么工厂模式的这个意义到底是别人问你,你怎么去答呢?就是它的最大的价值是将实例化对象的代码提出来。放到一个类中,至于这个类是一个类还是一个工厂,除就是有很多工厂,这个根据业务逻辑,你看刚才我们抽象工厂呢,它就变成一个工厂,除了就很多工厂。但是呢,都受我们抽象工程的管理,这样才能实现实现多态嘛,你如果没有这个抽象,你不抽象出来一个treat,那你这个下面的工厂各自各自为政,你也没办法用到这个统一的一个管理,就像刚才我的第一个思路,我原先这个思路他就不好使,为什么呢?我在这讲了一个思路。
15:16
我刚才这个思路,我用简单工厂,我就我拼命的创建,我说北京披萨,伦敦,为什么这种方法不好,因为你没有一个抽象工厂管理,他们将来就无法实现。多态,就你会创业的时候,你还是分开的不行,因此这个地方这样去实现肯定也是不行的,所以说这个抽象工厂呢,他就。干什么呢?诶,他就把简单和工厂方法结合了,就到这来了,就干什么呢。用类统一管理,达到和主项目依赖关系的结果。啊,你你创建就创建,不跟他跟他整个主项目之间呢,尽量关系是综合啊,从而提高项目的维护和扩展性。
16:00
体体会一下还是有道理的,那么工厂模式呢,我们这讲了三种啊啊,一个是简单工厂,工厂方法和抽象工厂,那么设计模式的依赖原则,我再多说点讲啊,依赖抽象的原则简单说一下,有人如果问到什么是。设计模式的依赖抽象原则,简单的可以给大家回答三句话。创建对象实例时,尽量不要遛啊,尽量不要周老师那不对,你这不是遛了吗?注意啊,我这遛的是工,我这遛的是这个工厂,我没有直接溜对象,对象在底层给我溜出来的啊,第一个第二个呢,而是把溜的这个动作放在一个工厂方法中并返回。有的书上是这样说的,变量不要直接持有,具体内的应用大家知道,为什么不要直接持有,因为你中间有个缓冲层。会会给我们一个。编写业务逻辑的可能。如果你直接溜出来。
17:03
那你没有缓冲层,你你们知道为什么你们学这个Spark优化,为什么要用缓冲啊,为什么要搞缓冲,就是因为有了缓冲层过后,我们可以只做一些业务的逻辑的,业务逻辑加的进去,优化也能加的进去,如果你直接六,这就直挺挺的过来了,比如说我6VVLDOG等于六道,这就直挺挺的给你整过来了,你就一点办法没有。就你想优化呀,或者批量处理呀,或者去做一些防范工作呀,或者做代理的一个安全检测,你根本没有机会,为什么一溜就这个代码的控制权就交给了底层,交给谁了,交给JVMG了。你没办法控制了,但是如果我是六到一个工厂里面去的,那么在工厂里面我是可以加这个这个相应的机制的。啊,所以说为什么别人说不要直接持有此类的引用是有道理的,就是它可以持有,但是他是通过一个方法给他返回来的,这样你就有一个缓冲。而在我们开发里面呢,经常提到这个缓冲层,包括我在后面讲这个,呃,叫做装饰者模式的时候,我还会提到缓冲层。
18:09
你看为什么咱们写MVC要要分成呢?为什么不用MODEL1模式呢?也是个道理。好。第二个不要让累。继承。具体的类。这也是个原则,就是叫做依赖,依赖抽象,我们类呢,一般尽量避免直接继承类,而是尽量去抽继承这个抽象类或者是。你直接继承一个类呢,有时候也是不是特别好,所以为什么现在大家尽量是用继承这个接口,或者继承这个treat是道理,还有尽量不要去覆盖基类中已经实现的方法,尽量啊,但是也不说覆盖和实现是两个概念。你这个覆盖了过后会出现一个什么问题呢?你到时间也不知道用的是哪个了,但是实现没问题,你看刚才我写的是一个抽象方法,我是让子类实现它,我就知道我一定用的是子类的,好这个呢,大家慢慢去体会吧,这个也没办法一下说完啊,好,同学们,那关于工厂模式抽象呢,我就抽象工厂,我们就先讲给大家介绍到这里,我给同学们。
19:13
阐述一下好,刚才我们讲的是个什么玩意呢?讲的是抽象工厂模式啊,呃,今天这些内容呢,呃,可能同学们需要一点时间来消化啊,可能不是一时半会啊,你就能把它理解的到位的啊。标题三。标题三,那第一个我们讲的抽象模式的概念,哎,那么抽象模式的概念从设计层面来说又是什么?好将工厂抽象成两层来看啊,第一层是我们的抽象工厂,第二层是我们具体实现的工厂指令。啊,两层。然后这个基本介绍完了以后呢,我给同学们说了一下这个抽象工程的应用实例,这呢,我也没有办法一一行一行给他记代码了啊,没有那么多没有办法了啊,那就标题三。
20:09
表现,那我还是老规矩,源码给大家保过来啊。源码我就直接从我们刚才写的这个objects里面给它复制到我们的worker文档中去。大家看代码。非常简单啊,抽象工厂给大家粘贴复制到我们的笔记中去,这个你双击就能打开,那么它这个项目的结构呢,也给同学们放一下。哦,大家知道是怎么做的。好,看这里。好,这是它的一个结构,然后代码做完了以后呢,我就对这个抽象,这个是刚才那个啊,对工厂模式我做了一个小结啊,简单说一下工厂模式的一个价值,好就写个工厂啊,工厂模式的小结。
21:01
好,同学们,我们写到这儿,那总体来说先说一下工厂模式的这个意义啊,它为什么,它的意义是在什么地方呢?我把这句话勾出来。就这个啊,它将实例化的代码提取出来,放在一个那种统一管理,这是它的一个实现,实现的思路,它的价值是达到依赖关系的结果。啊,我在创建的时候不要依赖你的组成。好,还有三种模式呢,大家知道创建啊,创建我们对象的时候呢,尽量诶不要这还有一个这说的叫做,呃,这个逻辑就是设计。模式中的依赖抽象原则,我这谈了这么三点啊,第一点。啊,第二点。第三点,那么同学们慢慢去体会啊,慢慢去体会好,那关于工厂模式的三种模式,呃,工厂模式的三种模式我就讲完了。
我来说两句