00:00
那么刚才呢,咱们讲了一个简单工厂模式对吧?好简单工厂模式呢,我们把它简单的给大家呃进行一个板书,然后呢,就刚呃讲新的内容,好,我们刚才讲的就是设计模式这个章节啊,设计模式这个章节。设计模式,对设计模式来一个就是第新的一个章节。那么设计模式呢?我们刚开始给他讲的一个学习设计模式的必要性。就说一下为什么我们要去把这个设计模式好好的学习一下,对吧。那具体来说呢,我这里总结了这么,呃五点吧,大家有个印象,第一点呢,面试啊,一般都会问一下,读源码也很重要,然后呢,有时候便于我们专业人员的一个沟通。
01:02
还有总结,最后这个总结话呢,我的理解是及通用的编程应用场景的模式化和套路化,诶这句话呢,大家可以想一想,好,这个说完了。说完以后呢,我们又说了一下掌握层次,这个我就不截图了,大家知道,哎,反正就是一个过程吧,然后呢,我们讲了设计模式,这这块也不是很重要,是大概说一下就是,呃,设计模式是咱们众多程序员一步一步走出来的,第二个呢,要知道设计模式有一个比较知名的啊,知名的这么一个四个人吧,他写了一本书叫设计模式,目前呢,仍然是设计模式里边的,就是最权威的一本书,他简称杠。这个哦呃杠four啊杠four就是四个人,然后设计模式呢,它是每个语言都要学的,所以说你学完卡设计模式再去看Java或者PP都是大同小异啊,大同小异,所以说我也写到这里来,这个是讲的设计模式的介绍。
02:03
对,说一下设计模式的介绍对不对?诶,设计模式的介绍,那么我一共给大家总结了四句话。啊,第一句话,第二句话对吧,啊,设计模式肯定是个好东西。对,同学们以后呢,在开发中呃,如果你能主动的就是用到一些设计模式,那么同学们可能就开始追求代码的优雅性能啊,现在可能大家更多的追求是功能先完成再说啊,下面呢,我讲一下设计模式的这么几种类型啊,这个还是要有印象的,对吧?23种三大类啊,那么这个分类模式呢,是采用的那个杠杠four啊,有些地方可能略有差异,但不会太大。啊,不会太大,好,我说了一下设计模式的这么一个分类,对吧?诶,那说了我们分类有几种呢?有这么三种对吧?诶那么我说了有这么三种,第一种呢是创建型的,那刚才我们讲的简单工厂模式,它就属于创建型的这么一个设计模式。
03:06
好,这个说完了以后,我们又说了一个什么呢?呃,这个简单工厂的介绍,这是干什么的?简单工厂呢,他是做什么事情的啊,做了一个介绍啊,刚才做了简单工厂对不对啊,标题二,简单工厂呢,我说了基本介绍对吧?诶,标题三。当然简单工厂它有这么几个特点,诶,这是简单工厂的一个说明。诶,简单工程,它是主要用来创建对象的。然后简单工厂这个说完了以后呢,我们按照看了一个具体的案例,就是让大家来分析这个案例咱们应该怎么搞,搞定它对不对,好,所以说引出大家的一个思考,那么这个案例呢,就是设计一个披萨店去订购披萨的这么一个案例也很简单,所以说我们为了让大家体体现出这个呃设计模式好处呢,先给大家按照传统方式来实现的,显然传统方式的呃优点就是简单,但是呢。
04:10
显然这个不利于代码的维护,对吧?诶所以说我们引出了传统方法来解决,但是呢,不够完美,或者说呃,这个成本较高,说传统方法呢,我这里就不去写它了啊,传统方法反正大家也不用,大家但是看一下啊,传统方法主要是体现在这里的,就是他要去拿一个对象呢,它总是去这样调用。那你将来,呃,你是定定披萨,将来还有销售披萨,还有批批量的这个卖卖披萨,那还有这个其他的,反正用到P上你都要去取些顿代码,很累,那怎么办呢?把这段代码抽象出来了。抽象出来,抽象成什么呢?一个simple battery,然后在另一面把我们这个东西搞定的好,那么我们传统方法说完了过后呢,我们用什么呢?我们用这个简单工厂模式来解决了,诶这个是他的,这是传统的优点缺点的一个说明,好也给大家反述到这里。
05:13
优缺点的一个说明啊,优缺点一个说明啊,优点呢,就是简单啊,大家一看就知道,也不用去动脑筋啊,大家都知道诶去创建了,缺点呢,当然就是说呃,他违反了就是一个OCP的原则,就将来就是改动地方会比较多。啊,你加一个披萨种类,只要涉及到创建地方你都得改。对吧,那肯定不划算嘛,不划算,所以说呢,我们就改进成了什么呢,改进成我们的这个,呃,一个新的东西就是。呃,这个我们用简单工厂把它搞定了,诶用简单工厂进行了一个进行了一个改进,好把它写到这。好,这个呢,我们用简单工厂进行了一个优化,哎,对我干什么进行。
06:01
进行这个改进,进行改进。啊,改进。那么改进过后,我们的代码就变成这个样子了啊,简单工厂呢,它是啊,这个代码我可能就就直接这样写了啊同学们。呃,因为代码这个太多了,我也没办法一个一个的粘贴,怎么办呢?简单我直接把这一段代码这样复制过来,大家看怎么看啊,直接复制,复制完了过后呢,我放到这儿,我给大家压一个包,因为这个代码太多了,我要一个个去贴,把这个时间咱耽误不起。所以说我就直接放到这儿啊,放到这儿就放到哪里呢,放到这个地方,但是为了让大家能够对它有点印象呢,我还是把这个程序的一个结构给大家放到这,就是大家在看原代码的时候呢,能够简单的回忆起来,老师大致是呃,怎么写的就是啊,Simple factory披萨店order和披萨啊,这样子大家可能看起来会轻松一点啊,它的一个程序结构图画好了,这个就是上次课的回顾,那下面呢,我们来看新的需求。
07:07
新的需求呢?就引出我们的工厂方法模式。那么工作方法式模式是怎么导致出来的呢?说现在披萨项目有新的需求了,什么新的需求呢?客户再点披萨的时候,可以点不同口味的披萨,比如说北京的奶酪披萨,北京的胡椒披萨,或者是伦敦的奶酪披萨,伦敦的胡叫披萨,也就是说披萨呢,有向下就是它的种类。下面有新的种类了。那这个时候你怎么解决呢,你看。我就说思路一啊,思路一,思路一用,我们还是用简单工厂模式。还是用简单工厂模式,那就创建不同的软件工程吗?比如说北京披萨来一个简单工厂。那么伦敦披萨来一个简风,这是可以的。
08:00
但是这种方呢,呃,考虑到这个目前这个项目的规模,软件性呢,可可扩性并不是特别好,所以说我就不用这个方法了啊,其实这个也是可以的,只是多了几个。工厂而而已嘛。对吧,第二个呢,我们就工厂方法模式,它更强调的是把这个,它更强调是把这个创建对象这个行为下沉。下沉啊,呃,就好像有些这个搞销售的是吧,诶以前那个咱们就在一线城市啊,到后面发现这个不行了,得把那个销售线往下沉到到这个村,到这个地儿去了,那这是一个需求,那么我们就直接看代码了啊,就不说废话了,工厂设计模式呢,它这样的将披萨项目实际化的功能抽象成方法,在不同的口味点餐指令中实现,就是我把这个下沉到下去,工厂方法模式定义的创建对象的抽象方法,由子类决定,要实例化的类工厂。方法模式,将对象实例化,推迟到之类。
09:01
啊,这个呢,有点不是很好理解啊,啊,但是呢,作为整体的讲,还是说到这,我感觉工厂方法模式不是特别的好玩,其实其实更好的是那个simple,就是那个抽象工厂模式更好,但是这个呢,也讲一下。那么我们直接上案例了啊,大家看啊。那么披萨项目更新息的客户在点披萨的时候,可以根据口味不同披萨,比如说北京的胡椒的,北京的胡椒,北京的奶酪,还有伦敦的,那怎么做呢?大家看这里啊,首先。我要去扩展。四个新的披萨。对吧,我有北京的来了,北京的胡椒伦敦的,因为你你你你你这个种类变了嘛,我肯定要加这个披萨种类嘛,这是这是理所当然的事情。理所当然,当然大家也看到这个地方其实已经出现问题了。啊,就是因为你的披萨,就为了因为加了一点点这个佐料,你就搞了一个披萨,那将来这个内回爆炸啊,将来这个地方还要有解决方案的。
10:04
啊,这个就是装饰者模式。啊,有时候它是工厂模式,假装饰种模式,它的模式可以不冲突啊,就你将来这个23种模式,可能是一个项目里面为了完成一个问题,它这个模式是综合使用的,不是说我用了工厂模式,我就不能用别的模式,它并不打架。啊,并不打架,说这个地方已经已经凸显这个问题了,后面我们还要说这个事儿,那还回头说我们工厂方法啊。那么我创建四个新的披萨种类过后,我怎么办呢?诶,这样子走,我把那个简单工厂拿掉了,我不要了。因为我希望把这个创建这个行为放到哪里去呢?直接把它下沉,你看我怎么写的,这是北京的奶酪披萨。他也继承披萨没问题吧?这是北京的胡椒披萨,他也经成披萨,那么我们看哪个地方改改变了,大家看这里。北京的这个披萨呢,我专门写个北京order披萨。
11:02
伦敦呢,诶,因为你这边有有新的种类,我把这个伦敦orderder披萨写到这儿,就相当于说把这个订购披萨这个行为呢,放到下面去了,Orderder披萨仍然保留,你看我主要看这两这个地方有什么改变啊,针对这个工厂方法模式,它是一个什么概念呢?它就是把这个创建这行为分别对应到自己的子类中。那怎么卸的呢?请看代码。啊,我把这个order披萨直接封装成一个抽象的,因为你原先本身是有这个创建的啊,创建现在我干什么呢?诶同学们看我现在这有一个create披萨,这个create披萨呢,我这里不创建了。因为你下面有很多子类,太多了,可能是北京伦敦。呃,很多很多。那我干什么呢?因为我不知道你怎么创建怎么办,我就你既然我不知道,我就不写嘛。我弄这个,我我把这个抽象这个方法写出来,我让你去实现不就完事了吗。而这也是一种思路。就像你管你的,我管我的,你是这个北华北地区的销售,你管你的内团,我不管,总部不管了,我就告诉你,你能用好他就把这个抽象成一个通,那么抽象吧,然后我北京搞一个北京orderder匹萨。
12:13
伦敦搞一个伦敦outer匹萨到这里面呢,我去实现你cream萨完事了。这种方式呢,就叫工厂方法模式。啊,同学们以后呢,有可能看到正方,那不说废话,我们改进啊,那么改进这个地方呢,同学们改进这个地方呢,为了呢,让他代码看的比较清晰,我不会在原单上面改,改完了过后就彻底的完蛋,怎么办呢?我我用这个思路啊,我们在这里呢,新建一个包包。哎,新建把它整个整个整个弄过来啊,新建我们这边讲的是工厂方法模式,因此我就新建一个包,注意听我就叫factory。哦,Y什么呢,Nice。
13:00
啊,这是工厂方法模式,就建立个包,我们把这个代码呢可以用,因为我不可能再重新写一遍,咱没有那么时间,我直接把这个代码复制一下。OK,然后呢,把它粘贴一下。啊,它重构好了,同学们看这边就有了,那么我就直接在这上改进,大家看能不能看懂啊各位同学,那现在呢,我们来玩一把啊,首先呢,我把这个呃处理一下,这个simple我就不要了。因为我现在用的是工厂方法模式,它的特点就是下沉。它下沉,那怎么做呢?把它干掉啊,干掉肯定代码有很多地方是要出问题的啊,啊就让它出问题啊没问题,我们就是要出问题,好现在呢,因为披萨我要扩扩种类了,我要扩北京的胡椒披萨和北京的奶酪披萨,那我写两个。好,注意听。北京北京的这个。确实,披萨PI。
14:00
好,同学们,那这地方呢,我仍然继承我们的披萨类啊,OK,那这名代码与这名代码呢,我们就写一个吧,后面我就粘贴拷贝。好,这里面呢,我们仍然去实现它的这个准备,原材料好,还是老规矩,Z点内等于我们的北京奶酪啊,奶酪披萨PI。同样我们也输出那样一句话,就是this.name走,加起来写上pre。洗完了。好,有了北京,来了北京的胡椒,我们再写一个伦敦,我就不写了,伦敦你们自己去写啊,有兴趣自己去写,那么我再建一个北京的胡椒披萨。好,我们写一个类啊,叫北京北北京的这个paper。PEP萨啊。好的啊,北京啤酒胡椒披萨没写错啊,然后呢,我同样把刚才这段代码我就偷个懒了,整个复制到这边来。
15:03
同样,我去继承一下这个披萨。诶,然后呢,我把这个改成北京胡椒披萨写完了。胡胶完了,那写完以后呢,我们因为没有没有工厂了,而且我要把这个搞成一个抽象的,为什么要把它搞成抽象的呢?原因很简单,因为我们现在有太多的子类,我不知道怎么创建。我不知道你怎么创建order披萨,我我不能全部都写在这里面,所以说我就这样写了,就是这里我们将这个orderder披萨做成一个抽象的。啊,做成一个抽象类,那既然是抽象类,那这个create披萨这个行为呢,我就不知道怎么办了,我就写到这里。先抽象,那我让谁去做这个工作呢?同学们请看啊,我在这里写一个抽象的方法。哎,这里我写一个抽象方法,因为我不知道怎么办了,抽象的方法干什么呢?就是create披萨这个抽象的方法。
16:05
好重方式让谁去实现呢?让各个各个子类子类去实现,创建或者是这个这个订购order,好代码就简单了,就像DF。好,还是我们这个create披萨,然后呢,这边我们写一个字符串啊,因为它这个呃接收的是字符串,所以说我就写一个,比如T吧,先写一个字符串。而写完以后这边还报错的原因是因为我没有写这个类型,因为他返回的是一个呃,披萨,所以说我写这个类型就OK了,披萨。好写完了,那写完以后呢,这边我们要引一下披萨啊,这个披萨我不要乱引,我就引我们自己这个工厂里面的披萨,写完代码就OK了。那现在呢?呃,因为这个订购的任务,北京也好,伦敦也好,我们就分而治之,那怎么办呢?我就写个北京order披萨。啊,注意看啊,这个地方可能同学们听起来有点感觉对吧,北京order披萨,因为我要把这个创建披萨的这个行为下沉。
17:10
啊,然后呢,我就写一个class,然后我让他干什么呢?我让他去继承这一个order披萨。好里面肯定是有一个方法的,这个方法就是我们的一个create方法,好这面怎么实现呢?好的,这一段代码我就不写了,同学们,时间的关系啊,我直接把这个代码拿过来为我所用即可啊,没时间写了,把这个呢拿到这里来。好,同学们,我把这个放到这儿来就OK了。放这就OK,那这边呢,我们要去引一下相关的内容。好,引进去,这边是北京的这个奶酪披萨。啊,北京的奶酪披萨,这边是我们的北京的这个胡椒披萨写完了。哎,这怎么写了哦,写了两份是吧,多了一份,删掉一份就行了,删掉一份就行好就写完了,那么伦敦那个我就不写了,那么我给你演示一下怎么用好披萨店来了,这个时候他的这个创建呢,直接就这样子,你要你要北京的披萨啊,我就到北京去北京店去订啊,这样子就可以了,一样跑起来。
18:18
来啊,我这边写一个注释啊,写一个叫用的是工厂方法模式来编写的,我写到哪里呢。呃,写到他订购这个位置吧。小。写到这儿好,我写到这儿啊,来写。好使用的,使用的是什么呢?使用的是这一个叫做啊工厂,工厂方法模式。方法模式创建,好玩一把吧,走运行一下。好运行一下,现在呢,我们,诶这边有代码有问题啊,看这里的问题是它会做成一个什么问题呢?就是因为你在这去创建的时候,这个地方我们披萨定义了两次,这是报错的。
19:04
哎,这样就没问题,然后呢,里面这个this我们就没有,所以说我干脆这样做啊,把它整体拉到里面去啊到里面去,然后这边呢,这个披萨没有引包啊没有,诶这边就做成这个。呃,大写的披萨。啊大于闭上好。诶,这个就可以啊,这边很讨厌啊小卷。好,那这个地方怎么办呢?这个地方是不能够啊,写成这个德性的,你要制成一个空啊,因为它已经不是一个属性的,好制成一个空里面这个this呢,全部去掉。啊,我这样写的啊,当然你要保持刚才那个也是可以啊,好,写完了,写完了我们来玩一下啊,玩一下同学们看,现在我这个就不要写简单工厂了,我直接改成啊,因为这创建的其实就抽象法使用的这个工厂方法模式。
20:02
二工厂方法模式。工厂。方法。诶,看一下啊。工厂方法模式,好,那这边这个北京order这句话我就先不在这写了,因为它上面是有的,好同学们我们运行一下,好运行起来。啊,运行起来我们看效果。好,运行过后呢,这边会提示让我们输入你要定的这个披萨的种类,好现在用的是工厂方法模式,比如说我要定胡椒披萨了,PP好,这个呢,就是其实北京的好ches。好,就是北京,那么如果我不订其他的我要退出了,是吧,就拜。啊,就退出这么一个逻辑,好,这样子的话呢,就代表我们如果要订北京的就北京,如果你是要订伦敦的,你你就到伦敦去订,它是分开就分而次之。好,这个方法不管大家认为好不好,你知道有这种方法就行了,好,那关于我们这个工厂方法模式呢,我们就讲到这里,好,现在呢,我把这个风量方法模式简单的整理一下啊。
21:09
啊,工作方法模式呢,首先我们是有一个新的需求,导致大家去思考的。好工厂方法、模式、标签。哎,那么这边我们做了一些什么事情呢?我们首先来了一个新的需求。带来一个新的需求,怎么做的呢?诶说有一个新的需求是这样子的。对,然后呢,我有思路,第一个思路。啊,第一个思路呢,就是咱们呢,就直接。创建多个这种简单工厂,我没我没有用第二个方法呢,我们想了一个办法,就是把这个创建行为呢,放到放放造纸内去完成,用工厂方法啊,工厂方法模式好,这是我们思路,紧接着呢,我们就直接介绍一下对公,它的核心是将对象实体化,推迟到此类。
22:01
哎,推迟到此类,那不管你喜不喜欢,他确实有这种方式啊。啊,后面我们讲的这个呢,就更好一些啊第一个。第一个好,第二个工厂方法的定义,核心是工厂方法模式,将对象的实体化推迟到此类,就说那个order披萨不做了。我让你只能去实现。对,我让你直接去实现,那么这个做完了以后呢,我们写了这个具体的代码啊,代码呢,我还是老规矩,按照刚才那个思路来走啊,我不一个个贴了,因为没有那么多时间来整这个代码了啊,代码量它是比较大的。好,这是需求,那么我把源代码给它放到哪呢?诶注意看啊源代码。源代码呢,我直接用这个压包的形式给大家,这这是我们那个简单工厂模式啊,为了好看,我这样子说啊,这个看起来因为它这没有分,我这样子做一下,重新来一下啊,我在这建一个测试的类啊,在这个地方建一个测试类。
23:08
好像他就会分了。建一个类啊,就是factory factory,第2MESSAGE me填D。OD。哎,没有鞋了。Factory。Factor method,为什么他这儿?啊,Test式的这样能能能分出来啊,可以可以分出来了啊,那其实我要讲我要看的就是这个包包啊,这个包包大家看这里面是我们的这个工简单工程,好,我把这个呢给大家复制过来。啊,复制过来,然后呢,老规矩把这个压一个包啊,压一个包就是工厂啊,给大家放到这里来,放到这里来过后呢,我们还把这个讲的这个目录的一个结构给大家也拿过来吧。好,同学们,晚上啊,建议大家把老师写的代码自己去走一圈。
24:04
对,这样理解的会更深刻一点。好,同学们,关于工厂模式我们就讲到这里。
我来说两句