00:00
这呢咱们叫代理模式,这就过了,然后下边呢,还有一个例子呢,叫关于这个工厂相关的这个模式了,这个模式的话呢,这样一说也挺多的,这个还是大家只是当做一个了解的例子就行,所以这呢,我们就没有必要花时间再去写了,那但是大家呢,可以去了解一下我们这里涉及到的这个工厂的模式,所以呢,我这个文档大家呢,只需要呢看一看就行,我们稍微呢顺一下。直接来看这个文档就行啊,就增加大家的一些算是一些这个建造的这个东西啊,多样性。这个工厂模式呢,它不是说有一个模式就叫工厂模式了,它其实准确的来讲呢,在我们23种设计模式当中呢,其实有两个,一个呢叫做工厂方法,一个呢叫抽象工厂,就是23种设计模式里边呢,是有这两个的。这块呢,就统一的就叫成一个工厂了,那还是从这个名字出发,不管是工厂方法也好,出厂工厂也好,都涉及到一个工厂,那你就得想工厂是干什么的,工厂呢,都是工人,工人的话呢,是不是就专门生产东西的呀,所以呢,我们这里边工厂提到呢,其实就是专门用来造对象的。
01:10
只不过呢,原来造对象呢,咱们是直接自己去用,就相当于呢,像以前大家你需要什么东西的时候,我们自力更生,就是你你你需要吃东西了,你就自己呢种点地是吧,然后自己呢,这个这个这个包点这个馒头啊饺子啊啥的,就自己吃,你自己呢,衣服没有了,你就自己呢去刨点羊毛这件衣服是吧,就是全都自己做,这就原来都是这样整,那现在呢,有了工厂以后呢,就用不着说什么都自己干了,你只需要干其中的一件事就行,其他那些事呢。这个用不着去干,你可能直接就买过来就直接用了,就那你看这里边提到这样的事情,就是尤其是像咱们现代社会的话,那个社会分工越来越细,这个每个人呢,只其实只需要呢,你具有其中的一项技能就可以了,你要会写Java也行。就可以活下来是吧,哎,然后呢,这个这个吃穿呀,哎,你都可以,只要会这个,你可以拿你这个价值,你去兑换其他的那些价值的东西啊,那这个工厂工厂呢,用最简单话呢,我们来体现的就是说咱们呢,就是首先工厂是用来造对象的,那我们这个工厂模式想实现的效果就是让这个创建者和调用者呢分离。
02:20
创建者就是我们你有对象的这个这个结构叫做创建者,那调用者呢,就是我拿着这个对象呢,我要去做事,这叫叫做调用者,我不希望呢,调用者和创业者混在一起。啊,这呢就是我们工厂模式想要解决的问题,行,那下边呢,我们接着往后走,那么关于我们这个这个这个设计模式的设计的话呢,一共提到过遵循的六个原则,大家呢,在我这个给的课件里边这个位置,你能看到这里边提的那个几个原则啊,我就不打开看了,六个原则,那么在我们工厂这块呢,能体现在能体现到的就是其中的三个原则,具体这每个原则呢,也不多说了,过了啊,那针对我们这个工厂模式范范来讲,这个工厂模式我们下边来谈一谈,那么工厂模式这块呢,涉及到叫简单工厂,工厂方法和抽象工厂,这个简单工厂的话呢,这个你可以把它含在这个工厂方法里边,把它俩呢可以看成是一个。
03:16
这个广义上的一个工厂方法了啊,那初要工厂呢,就是另外一个,那首先呢,咱们先来看一下什么呢,就是没有工厂的是一种什么情况,就没有工厂,就是不涉及到设计模式的,好看一下,这呢是一个接口叫汽车,然后呢,我这呢是一个奥迪车,奥迪呢就相当于实现了我们这个car了,但是这块我用这个car当成一个接口,其实不是特别合适啊,像这种呢,都按说是子浮类的关系了,是为了稍微形象一点,我这就把它做成个接口了,然后这呢是一个奥迪车,它呢有个RA说奥迪在跑,然后咱们国家呢也有一个迪,就是比亚迪,差不太多是吧,比亚迪,然后呢让他也去实现这个car,他呢就也可以跑了。
04:00
这就相当于一个接口,两个时间类,那下边咱们这有个测试类,在这个测试类里边,我们就直接new这个奥迪,New比亚迪,然后直接呢,让它run,这里边我说呀,你的创建者和调用者就混在一起了。就是这是不是创建啊,咱们这个类呢,你像这个类体现的就是我其实想调某个功能了,就是这块呢,实际上相当于是调用者了,但是你这块呢,又是创建的功能,相当于我们这儿呢,在这个类当中,既体现了创建,又体现了调用,就是混到一起的这个事儿啊,这就没有工厂,说白了就是这时候呢,没有厂子去做,你自己在这儿造了一个奥迪,造了一个比亚迪,是吧,这叫没有工厂的情况,那下边呢,咱们来看一下有工厂了,来了一个简单的工厂。从这名字上也能看到,它其实比较简单。战场还是这个车,还是这个奥迪,还是这个比亚迪没有变,但是现在的话呢,我们有一个工厂专门帮你去造车了。我这有一个叫factory,就是car的一个factory。后续大大家呢,在我们后续讲解课程当中,你会经常会看到一个叉叉叉factory,只要你看到这个叉叉叉factory呢,你就稍微敏感一点,对,就是这个东西的一个工厂,工厂呢是用来造对象的,是不是就专门用来造这个叉叉叉的呀?
05:16
对,后续呢,我们看到API的一些结构的时候呢,它就会这样去命名啊,哎,你有这样的一个意识,那么我这儿呢,叫car factory,就专门来造汽车的一个工厂,那我这里边呢,写了一个静态方法,就盖car,我想获取一辆车,然后根据呢,我们传的这个字符串,你要是一个奥迪,我就给你造个奥迪,是比亚迪呢,造比亚迪是别的呢,写错了就是no,这是一种写法,或者的话呢,我们直接在这个工厂的呃类里边呢,提供两个静态方法,就是get奥,你就给我造一个奥迪,Get比亚迪,你给我造个比亚迪。就是这个factory呢,体现的是不是就只是一个创建者呀,对,它是个创建者,就是创建呢,就单拿出来了,然后下边这个呢,就是独立的只体现一个叫调用者,我们呢,通过我们这个car factory,我去get一个car,把奥迪这个字符串往里一放,就能给我们返回一个对象,返回对象,然后我这块呢,拿着这对象呢去操作了。
06:14
就是我们这儿呢,主要体现的就是调用灶的事儿呢,你专门呢,通过工厂去帮我做好,哎,去帮我做好以后,大家看到叫叉叉叉factory,这时候你要往这个设计模式工厂这块呢去想啊,这个我们称作叫简单工厂,稍微有点意思吧,这个有点概念啊,好下一个,那么有了这个简单工厂以后啊,我们说嗯,我们确实把这个调用者呢和创业者分离开了,这是算它的优点,但是的话呢,它有缺点。缺点就是说,如果我们要是增加产品的话,比如说你现在是比亚迪奥迪,还有宝马,还有这个红旗,嗯,这你要是加产品了,你想想咱们是不是就得需要在这个factory当中多加几个I衣啊,那就意味着我们这个代码如果要是扩充功能的话,你就得需要对现有的代码呢进行修改了,那这个事呢,其实不太好,咱们尽可能的希望这个代码呢,对,对于这种修展的话呢,你看这就叫违反开辟原则,就是对扩展呢是开放的,对修改是封闭的,就尽可能的话呢,你要想扩展功能的话呢,在现有的基础上你去加,你不要呢,想扩展的时候呢,对我现有的代码进行修改。
07:27
那代码很显然咱们做了一个项目了,你现在功能想扩展了,最好呢,是独立的,又可以去添加原来的不受影响,那你现在要想扩展,必须把原来代码给改了,这个风险很大。有可能改不好了,就原来的项目都跑不起来了。就成这样一个情况了,这呢就叫违反了,违反了要开辟原则,就是我们要想新增加产品,必须要修改代码,那怎么办呢?提到了一个叫工厂方法。提到这个工厂方法,那这块怎么设计的,还是一个car的接口,两个具体的奥迪,一个比亚迪行,此时这个工厂呢,我不再使用一个类来设计了,而是用到一个又是一个接口啊,这个接口呢,就叫做factory。
08:08
或者你叫做car factory也可以啊,也可以,那么这个接口当中我定义了一个抽象方法,就是来返回一个car的。但是返回什么car呢,不知道,抽象的行,然后针对这个接口呢,我们去提供具体的工厂,这个呢,就是专门来造奥迪的个呢,是专门来造这个比亚迪的,提供两个实现了这个factory接口的两个工厂具体的类,然后在这里边呢,我就重启了这个方法了,你这个get car,我就给你get一个奥迪这个反问质类型咱们说过了,重写的这个方法,或者要实现的可以比这个类型是不是小是吧,这有个此类了,或者你这块呢,就写成car也都无所谓啊,都OK,那这样的话呢,我们就相当于是提供了两个具体的工厂的子类呢,我去给你造具体的车了,然后下边测试,那你需要奥迪了,我们这块呢,是new的一个工厂,然后呢,这个工厂当中我们去盖了一个car,光盖了car就行,对象呢这块就帮你造好了,然后返回一个,他这个呢就返回给比亚迪。
09:08
哎,就这样个情况,嗯,这里边呢,如果我们需要功能扩展的话,你可以添加具体的车,然后下边你就添加具体的工厂,现有的这个是不是就不用动了,对吧?哎,就这样了,诶但是这里边你看这又写到这个事儿了,说简单工厂和我们这个工厂方法的模式,真正避免了代码的改动了吗?说其实也没有。为什么呢,说在简单工厂模式当中,新产品的增加呢?我们需要修改工厂的这个角色的判断语句,你不得多加几个LC吗?但是在这个工厂方法,这个设计模式当中呢,我们要么呢,将这个判断逻辑呢保留在工厂的这个角色当中。呃,将这个判断逻辑保留在工厂抽象工厂的这个角色当中,就是你这还是涉及到有好几个具体的子类工厂的子类的一个创建,要么呢,就在成为当中,我们将具体的工厂角色写死,像这种这不就属于工厂的具体角色就写死了,其实呢,还得你要说的话呢,这也算是再添加,他也看成是一种改代码了,那那能不能更好一些,或者能不能这个再优化呢?这个就提到了一个说我们能不能动态的去这个这个创建一个工厂的角色啊,那这块具体该再怎么去深入的理解呢?这块就得需要用反射来做了,就这块呢,现在也提到他的一些这个再优化的一些点啊,那反射的话呢,这块咱们还没有讲,那讲到这个Java基础高级部分呢,我们再体体会啊,这个反射的大家可能也慢慢的感觉到了,说好像有点难。
10:39
啊,这个反射呢,其实主要呢,就体现了Java这个语言的一个动态性啊,动态性讲到这儿的时候,我们再说啊,那么整个呢,关于反射的机制,反射呢,其实在咱们后期的框架当中是大量的被使用的啊,大量的被使用啊这个我们到后边呢,提到这个框架的时候呢,再具体呢去解决这样的问题。好,这呢就是我们说的这个工厂方法,然后这个抽象工厂,抽象工厂呢,说这个工厂方法呢,它俩的区别呢,主要就是在于创建对象的一个复杂程度上。
11:07
啊,就这块儿呢,就更复杂了,有了这个足的概念,这个我就没详细的在一块去写例子了啊比如说呢,就像这个车,奥迪也好,奥迪呢就是一方面呢,从这个车的分类上来,它就分成这个叫奥迪车,还有比亚迪啊,还有其他的这个车,这是一个层面,那这个具体的车的话呢,它可能又分成这个叫跑车系列的,还有这个商务车系列的啊,又分成这样不同的系列的,然后我们呢,除了这个车呢,这样一个层面归成一个车的概念之外,那么专门针对这种跑车呢,我们还称成还专门有个叫跑车的一个一个族。啊,这样一说呢,就复杂了,那这呢就提到了说其实呢,这个抽象工厂只是比我们的跟这个工厂方法相比呢,只是说这个复杂程度上要更多一些,这块呢要写起来,或者只能是我们看以后咱们写代码当中具体哪用呢,我们说一下这块呢,就不在这儿去写这个例子了,好简单的,对这个工厂相关的这个模式呢,我们说明了一下,大家呢,就是有这样一个印象,知道这个工厂模式是干什么事的,这里边呢,就涉及到这个接口的一个使用,诶这个了解一下就可以了啊。
我来说两句