00:00
好,我们先来看第一个模式,叫简单工厂模式。啊,简单工厂模式。那么简单工程模式是个什么东西呢?简单工程模式属于创建型模式,它不属于23种的有杠O模式之一,因为它是相对来说比较另类一点的啊,它不属于这个,但是为什么要讲它呢?因为由它可以引申出来我要讲的内容。那么简单,工厂模式是指由一个工厂对象决定创建出哪一种产品类的实例,这个产品呢,你可以把这个产品去掉。啊,就是有一个工厂对象决定你应该创建哪一种类的实力,但是我把这个产品放到这儿也没有错啊,简单工厂模式是工厂模式家族中最简单实用的模式,同学们在开发中一定用过这个。啊,一定用过这个,那么简单构造模式什么意思呢?定义了一个创建对象的对象的类,由这个类来封装实例化对象的行为。
01:05
理解,也就说他有个方法叫,比如说叫create。什么什么什么,就说你要对象吗?要找到他的这个这个这个这个工厂点出来了。啊,就这么简单。就说你要你要对象,你就找他方法他给你返回。你你可能要传一个参数,比如说我要什么样的对象,我是要自行车还是要什么,你就给我就完事了。好在软件中我们会大量用到创建某种类某某种某类某批对象时,就会用到工厂模式,这是基本介绍。那下面呢,我们来看一个具体需求,还是老规矩啊,同学们为了讲好这个设计模式,我是准备这样讲的。我们说设计模式好。是相对而言,比如说你的女朋友。对吧,说诶说你长得很帅啊,为什么?因为他是女朋友,他肯定说你长得帅嘛,对吧,那是为什么,相对而言,相对什么相对你。
02:03
就旁边坐的那位男生,所以你说你看你看,确实我男朋友比他长得帅,对不对,你要换一个人试试看,你要跟韩老斯一比都没法比了,是吧,所以说我我我的意思就是说什么呢?我的意思是说同学们在说这个模式好,你首先得去看一下他传统是怎么解决的,然后一对比,诶,发现人家就是好,诶,你就能理解它的东西了,如果说没有对比,你很难发现它的妙用,除了你知道这个东西,你也不知道好,我们看一个案例啊,现在呢,我有一个项目。我有一项目叫披萨项目,这个也是这个杠杠F里面的一个项目,我就用这个来讲的,但是目前在市面上没有一款。就是在市面上没有一个特讲师卡这个设计模式的书啊,网上资料也非常少非常少,那我我这边是花了一很长时间去把它整理一下,就是根据自己的一个经验把它整理出来的啊好,那么。
03:05
这个看一个披萨项目是什么,首先我们要求要便于披萨种类的扩展。要便于它的维护啊,要完成什么呢?完成披萨的订购任务,这是我要做的,那么披萨这个图就是这个披萨相关的有多种披萨,我是怎么设计的呢?大家看。我是准备这么设计啊,大家看这段代码。这边理解的东西比较多,代码也不少,假如我这里定义了一个抽象的披萨,里面呢有四个方法。这四个方法,第一个方法是准备原材料,Prepare。啊,贝壳是烘烘字。啊,这个呢,Cut是呃,切割就是咱们那个面包做好了,或者披萨小去切,然后这个box呢就是打包。啊,也就是说我意味着我们制造一个披萨呢,有四个流程看懂了。
04:00
那么这个披萨呢?有不同种类的披萨,第一种这个披萨那叫Greek披萨,叫希腊披萨,这个切实披萨是奶酪披萨,当然我将来还会有很多更多的披萨,好,现在我们要要针对这个问题让你搞一个设计。搞什么设计呢?要便于维护,还要给我完成订披萨订购的这个功能,现在我要开始写了啊,大家先理解我的需求是什么,我要做一个披萨店。这个披萨店里面有很多很多的披萨,各种种类披萨,你要给我支持,我可以创建各种披萨,同时呢,还要完成一个订购,还要完成披萨订购的这么一个方法给我写出来,那么订购披萨里面肯定有创建披萨,你订完了要给人送过去啊。好,这个就是一个需求,先理解了啊,现在首先我们先来看一个传统方案。传统方案大家先看啊,这是老师写了一段代码,待会代码呢,我们会给大家演示一下,先看这些代码对于你们来说目前都是很非常简单的代码,那么我们来先搂一圈,首先呢,我抽象出来一个披萨,因为我不知道。
05:09
你将来有多少种披萨,所以说我抽象出来。对,我先给他一个名字看清楚了。那么。这个切割,烘焙,还有打包,我们认为基本上都是一样的啊,我们认为是一样的啊,假如我认为是一样的,其中有一个方法不一样,就是准备原材料不一样,比如说你做的其他披萨呢,他准备的可能是一种什么。这种材料,比如说你整理这个胡椒披萨,可能是胡椒为主,有有胡椒,那么我那个奶酪披萨呢,准备的原材料可能不一样,所以说我把它抽象出来了。这个很正常,好,紧接着呢,我做了一段代码大家看。我用我写了一个希腊披萨,注意听啊。这里面最主要是个理解。你要理解了就懂了,你要不理解这个也很难理解。
06:00
这是Greek披萨,他继承了一个披萨,这个披萨干什么呢?我重写了这个play方法,我重写这个方法,他说,哦,这是希腊披萨了,我准备这个希腊披萨进行准备了,那么我还有一个什么呢?胡椒披萨,Paper paper是胡椒,有些老外喜欢吃胡椒披萨啊,我反正是不喜欢吃的啊,PEPE,这个胡椒披萨干什么呢?他在准备的是他准准备的是胡椒。啊,有胡椒这个原材料,假如我们写了一段代码,好写完了。那现在呢,我这做了一个方法叫做订购。看到没有,好,我在订购,怎么订购的呢?按照我们不用模式的方法,传统方法肯定就这么简,简单吗?你要一个我给你溜一个吗?来人这东西的好,要订购了order披萨了。说诶你给我输一个,就客户要订购披萨,你输一个order type,你要订购什么披萨呀,好,我这有一个循环。循环干什么呢?如果你情义速度,你要订购披萨的类型,如果这个哥们定的是希腊披萨,我就给他构建一个希腊披萨给他,你你定嘛,我就给你了,如果你订购的是,诶各位同学,你订的是胡椒披萨,我就给你创建一个胡椒披萨,然后开始准备,开始烘焙,开始切割,开始包装送给你。
07:22
代码写完了,大家看传统的方法就是要写,但是没有设计模式,那么我先把这个代码跑起来啊,跑起来,为什么?因为我要在上面做改进。我要做改进,那么这这段代码怎么去写呢?好,同学们看,当我写完了过后,我这还有一个披萨店。这个披萨店呢,我就去溜了一个orderder披萨,然后呢,一溜它里面代码就会让你输,同学们啊,我们先看传统的代码,那么我们来把这个写一把,好,这写的symbol,这是简单工厂模式,里面有个披store,里面有披萨和use,好,同学们,我们写成代码,这段代码呢,肯定我会把这边写好的拿过来用啊,我们不会再写了,因为这里面的代码我相信没有一行你们看不懂。
08:08
你要说有一行看不懂的,那你就赶紧去看卡的基础啊,那就不要先不要学设计模式了,先把那个基础看懂啊,这一段代码如果说看不懂的同学那太可怕了啊好,那现在呢,我们把这块先给他跑一下。好,我先打个包包。我们就叫simple啊,因为待会我要改进嘛,叫simple factory。Factory,没问题。好,然后呢,我在这里新建一个包啊,为了有个分成呢,我先写个test,好,这边呢,我写一个叫做我们的披萨,这个我刚起的名字叫什么啊,好像叫披萨店,对披萨store,披萨店对的没问题。好,我先把这个关闭好,同学们认真听啊,这个课呢,还是有价值的啊,有价值的好,我先建一个啊,诶这地方有些东西了啊,我先建一个这个包包啊,这个包呢,我们就叫披萨,那披萨店披萨。
09:07
披萨速冻。啊,这个就在这里面开始玩,我们东西建建起来,建结构,在这里面呢,我们又要去建两个包,一个是专门管理我们披萨的,一个是使用啊披萨。OK。好,然后呢,我在这里面再建一个包啊,因为我不打把这个包打好,后面我们代码是越来越越难看。披萨store里面呢,有个use或者叫order也可以啊,叫order就订购啊,订购这块代码写到这好,那现在呢,我们先把披萨拿过来,我们现在呢,建了这么几个类啊,同学们第一个呢,就是我们这个披萨一个抽象类,我拿过来用用。不写了啊,简单的很。好,来吧,但是我为什么不整体拿过来,因为还是让他看到这个过程好,我写一个叫披萨PI pis披萨好,这是个抽象的。
10:00
好,那么这个地方是个抽象的呢,我把这个代码拿过来,刚才我们有这段代码啊,同学们就是这段代码我拿过来用一下。好的,非常的简单,往这放一下。好,大家看这个是一个抽象方法啊,抽象方法没有实现,因为不同的披萨呢不一样,现在呢,我开始继承,我先写这么两个披萨啊,第一个呢。就是我们的希腊披萨。披萨。APIZZ披萨。那现在这边我让他干什么呢?我让他继承,我让他去继承我们那个披萨,继继承我们那个披萨,披萨是那个刚写的啊,披萨好写完以后呢,显然我们要去重写那个方法。有例子准备吗?准备,准备的时候呢,我直接写一句话,哎,我认识一下,说我这个披萨呢,就把你的名字给他夫了,就是我们的希腊披萨。
11:01
啊,希腊。希腊提上。好的,然后呢,我们这输出一句话,哎,输出一句话什么呢?点内说这个希腊披萨正在准备preparing pre PAR。好,这是他正在准备写完了,与此同时,我们再建一个啊,胡椒披萨。啊,呼叫披萨PEPEPE披萨好。啊,披萨好,这个呢,我就稍微快一点,把刚才写的这个代码呢,拿过来复制一下就可以了,好的,同样我让他继承一下,哎,继承一下那个披萨。写完了,把这个名字改成胡椒。啊,胡椒好,胡椒披萨这写完了,那现在呢,有了两种披萨以后呢,我们在这个orderder里面呢,我们就写一个定披萨的方法,比如说我就叫order披萨。
12:03
OK order,披萨就是在这里面,别人调用我们,我们就把披萨给你准备起来,你要什么吃什么,对吧,给你。好披萨好的就是order披萨,那么order披萨里面的代码呢,我就不去一个个写了啊同学们,代码呢也非常的简单,我把这个呢拿过来用一用就可以了。嗷,熬着披萨就从这开始啊,各位同学,这个代码大家都能看得懂,很简单的一段代码。拿过来,放在我们的笔记中去。写完了。来理解一下,那这边我要引引包了,先把披萨引进来啊,不要引错了,现在我们用的是这个。好,这个地方呢,我们也要一下啊,这个是,呃,我们定的希腊披萨,这是胡椒披萨。好五角披萨,然后这边还有引一下包import对吧,大家记得是在哪里呢?是UT2点里面是吧。controls.break点这个写完了,好,同学们看啊,把逻辑理一理,现在我这有个orderer披萨,然后呢,我再给你让它循环的去请输入,如果你输的是Greek,这里我们是创建对象的,大家看关键点是这创建这个披萨。
13:15
那么这种方法肯定到时会要被改动的啊,这是创建披萨。好这些写完了,那写完我们再怎么去,呃,创建一个披萨呢,我在这个披萨店里面去创建一个东西,比如说我这几个披萨store。好,第一个我写慢一点啊,后面我们就粘贴了披萨stone。好的,那这里面呢,我们写个object。Object,然后呢,我们写一个主方法。啊,那干什么呢,我们六一个alder披萨。好写出来,现在呢,我们开始运行。一运行,大家看代码。运行,那么运行过后呢,这边必然啊,这边有一个这这是什么东西来着啊,这以前写的这个东西先删掉啊,删掉再重新来。
14:02
重新来啊,再重新来让一下。Run一下,好让一下,过后呢,它会让我。这个地方就是啊,这个地方是什么时候写的这个玩意儿啊。啊,再再重新来一下啊,再再重新来一下,应应该没有了啊,应该没有了。好,跑起来了。那么起来过后呢,它会提示我对吧,他说你要请叔叔,你要订这个披萨吧,好,我选break。啊,他说你订了这个其他披萨,今天准备了,烘焙了,切割了,打包了,好,然后呢,我又说我这次呢,要换一个披萨,要奶酪披萨。他也给我创建来,诶这个地方没有哦,胡椒啊,胡椒披萨啊,我就退出来了,因为大家看我的代码,如果他输的,呃,不是这两个呢,我就break了啊大家看到效果,同学们看这个代码呢,我们来看看这个问题在什么地方啊,代码写完了。传统的方法,代码写完了,我们来看问题在什么地方。
15:00
问题在什么地方?分析一下他的问题来看。啊,看一下。那么我们说传统的这个方法呢,优点是比较好理解,简单易操作,特简单,你要在哪里就溜。但是这边有个最大的问题是,它的缺点是违反了设计模式的开闭原则,即对扩展开放,对修改关闭。比如说。当。这个这个原则我就不讲了,原则就是开辟原则就尽量不要修改代码。那么现在有一个麻烦事。什么麻烦事呢?比如现在我要增加一种新的披萨种类,你看我要改哪几个地方呢?首先我增加披萨,比如我增加一个奶酪披萨,切披萨。好,我把这个写进新增了以后呢,同学们看到我要直接在这段代码加一个as。也就这个定。Order,披萨这地方我要去重新加入一种代码。但是加段代码本身是很正常的,可惜同学们理解一下我的意思啊。
16:05
你在这儿加一段代码,你这是订购披萨加代码,那我问大家,你们将来在开发中有没有一种可能性,在又有一个类叫比如说叫buy,叫做sell销售披萨。哎,各位,你这假设有个6CL披萨,在这个CL披萨里面,人家也要说,哎同学比如说比比如说那个跟我说,哎来哥们,我我我要买一个披萨,来一个来来一个这个来,比如说这个这这个客户客户说了啊,客户说了,客户说来来一个胡椒披萨。胡椒。胡椒披萨,请同学们思考。你是不是意味着来一个胡椒披萨就意味着你这吗?这个你意味你这个不是从工厂里面取的,就意味就味着你这段逻辑是不是又又要重新在里面写一遍才行呢?肯定的。因为你这个逻辑,你你创建这个,你产生一个披萨,你不是。
17:00
从一个工厂取的,而是干什么?你没有把这张代码封装起来?而你这种逻辑呢,在很多地方都有可能用到,那就意味着你将来一旦涉及到这种逻辑,你每个地方都要去写。大家看是不是这个道理?但是为什么说如果只针对这一段代码,其实。完全可以不写这个工厂模式。因为你就这一个定。这个定定这个披萨的地方,但是你想将来我们产生这个披萨的这个地方的应用场景可能会很多很多。可能要销售,可能要买,可能是那个打包或者批发等等,那你这个地方就很麻烦的,怎么办呢?好,同学们从这里面看出来这个逻辑,这样越改越乱,所以看到比如我们要新加一个披萨,我们要做这个订购的时候,要做这个修改,而且每个地方都有可能要改。这样是不划算的。于是乎呢,我们就提出了一个新的观点,改进思路,怎么改进呢?所以听这句话啊,我说了设计模式本身就比较虚,所以大家听的时候呢,一定要认真去体会它的好处。我的改进思路是这样子的,我首先说了一句话,修改代码可以接受,说没有哪一个人说我不修改代码很少。
18:14
啊,你修改代码可以接受,但是如果我们在其他地方也有创建披萨代码,就意味着也要修改,那么在创建披萨代码往往有很多地方,那你改的地方太多了。那怎么办呢?好,人家就提出一个观点,干脆这样,你就不要这么干了,你不就是创建披萨吗?你创建披萨的逻辑不就是那那那几种吗?咱咱们要改可以改一个地方就完了,其他地方只要这一改,你只要是拿披萨,我全部都给你搞定,多好一件事可以的,怎么办呢?他说把创建披萨的一个对象。封装到一个类中,这样我们有新的披萨种类是只需要修改该类接口,有其他创建披萨对象的代码就不需要再修改了。你看这个逻辑就出来了,虽然很简单,但是呢,它也是种模式,这时我们就提出了简单。
19:06
简单工厂模式就来了,好,同学们,有了这个东西,老师要开始改变了啊,我也不多说了,直接上代码。直接告诉他怎么剪。简单工造模式的设计方案,定义一个实例化披对象的类,封装创建对象的代码,我要写一个simple pizza factory,把刚才创建披萨的一种代码直接给我拿到这里去,然后在创建披萨地方,我用simple披萨给你拿一个披萨就可以了。完事了啊,其他地方就一改白改,我将来如果说真的有披萨增加了怎么办呢?我只在这儿改一个地方。搞定。搞定好,我们把这个地方给大家简单的处理一下啊,来,各位同学,我写一个simple。来走代码,我在这里写东西了啊,那我这我直接来一个啊案例。哪里注意听啊,同学们,我这写一个叫做simple factory simple factory没毛病吧?
20:07
然后呢,在这里我就其实说白了就是把这段代码。把你刚才的这个if这段代码,啪啪啪整个把这段代码拿过来。啊,就这段代码,就是创建披萨的这段代码拉过来,哎,比如说这个地方啊,这个地方拉过来放到。把这一段啊,我复制一下。好复制一下放到哪里去呢?放到这里面去对吧,要写个什么呢?叫诶当然这方应该写成一个呃,Object,因为呃静态的嘛,对吧,进来你看我这也写的是一个,哎,这地方没有写这个静态吗。写静态应该更更简单一点啊。这应该写成静态的比较好是吧?Object我直接用就可以了吗?就啊这个地方我还溜了一下,难道没有必要啊,就是写成静态的就可以了,那我把这个代码拿过来吧。
21:02
啊,直接拿过来用一下就可以了。好,这边呢,我写到这里了。啊披萨大家看这边这个代码呢,我整理一下啊,说我这里就提供了一个啊,提供了一个什么呢?创建啊创建披萨的。披萨的一个方法啊方法,那么只需要需有人要披萨时,有需要创建披萨时啊,创建这个披萨。披萨是调用该方法即可,调用该方法即可,好,那代码我就改进成这个样子了,就是我给你创建一个披萨,我看你传的是什么,这个就是它的那个类型啊,如果你是Greek,就返回一个Greek p是呼叫返回呼叫是来酪,返回来酪,好我把这个代码简单的处理一下。这边我们引引引一下啊。一下引入我们这边的,这边是我们的希腊披萨,这边是我们的胡椒披萨。
22:08
还有一个这个披萨,我这没有写,我把它加进去啊,快速的写一个奶酪披萨。啊,就是相当于做了一个小小的扩展,C1奶酪披萨。好,同学们,代码写到这里,然后呢,我为了省事,把这个代码直接拿过来用一下就行了。好,然后呢,我让他去继承那一个披萨对不对啊PI啊,这个披萨说多了好像。好像很想吃的样子,对不对啊,奶酪啊奶酪奶酪披萨好OK啊,写完了过后我们回到这个simple,那这边就可以引入这个奶酪披萨。写完了,那写完过后,我们将来这个order披萨的时候,我们怎么占呢?好同学们,这一段代码我们将会被拿掉,诶拿掉怎么走呢?同学们看啊,我这里呢。这不是有披萨吗?对吧,你你这你这要定一个拿到一个披萨怎么办呢?好,我这里给你一个披萨就可以了。
23:06
直接。披萨。等于我们的这个simple啊,Simpleer.create对吧,你把这个order type给我啊,我给你返回即可呀,即可,当然这里面有个问题,就说什么时候退出呢?大家看我这有个逻辑啊,各位同学看到这我在检查工程是呃,默认我给了一个空,如果说他这给的不是Greek,又不是paper,又不是chess,我原封返回就是一个空,因此呢,我在这个al地方,我做一个简单判断,如果这个哥们。返回的这个披萨,它是等于这个no,那就意味着我也就退出了啊,那就是break完事了。好,以后需要地方直接拿这个symbol就走走就行了,不需要。反复改动以后,如果将来再有披萨的改动,你要修改的地方注意啊,添加代码不算修改。我增加一个披萨,我又没动你原先代码,这个是允许的。
24:03
啊,后面大家也看到,待会下面讲的这个咖啡店更有意思啊,就说你这加一个类,只要不动源代码,这都是OK的,那么我们以后要改的地方只有这一个地方,哪里呢?就这一个地方改一下,比如说将来又增加了一个新的披萨,比如说是呃,糖果披萨。诶,你就可以往里面这样一改,其他就就一一改白改好这边代码就写完了啊,我们来跑一下。现在呢,为了演示一下,我这视频是使用了简单工厂模式。好了,同学们,我们来玩一把,看看能否运行。跑一个吧。哎,不是在这儿跑啊,怎么跑这儿来了,是我们的这个披萨店啊,还是订购一个披萨。还是订购一个披萨,那现在这边它提示说,诶哥们儿,你用的现在是简单工厂模式,好,那么请输入这个类型,我们就随便说一个吧,Paper,好,胡椒披萨给我来一份来了好,说现在我们还有这个来了披萨来一份来了好,我们还有什么呢?我们还要这个希腊披萨,Greek给我来一份来了好,现在我不吃了啊,我我不玩了,说拜拜啊,来我就咱们就退出去了。
25:14
好,这样子呢,大家应该感受到这种模式还是有价值的,好同学们,关于这个简单工厂模式呢,我们就先给大家讲到这儿,我们休息这个七分钟啊,休息七分钟啊。
我来说两句