00:00
同学们,我们来看一下这个简单工厂模式的基本介绍。同学们可以看到简单工厂模式呢,它是属于一种创建型的模式,我们在前面讲模式分类的时候已经提到这个观点,它是工厂模式的一种,那简单工厂模式是有一个工厂对象。决定创建出哪一种产品类的实力,就说我们这个工厂模式,这个工厂对象,它可以根据用户的选择来创建一个对象实例,这个对象实力就是你要的,我给你就行了,那简单工厂模式呢,是工厂模式家族中最简单也是最实用的一个模式。所以说。简单工厂模式是我们工厂模式里面用的最多的。那给他一个定义是什么定义呢?就是简单工作模式,是定义了一个创建对象的类。它是它其实就是一个工厂类,那么这个类呢,封装封装了一些代码,封装什么呢?封装了实例化对象的这个代码,也就是我们说的行为,他把实例化这个对象的行为,或者说这个功能封装起来。
01:13
那在软件开发中,当我们会用到大量创建某类或者某种或者某类或者某批对象的时候,会使用到工厂模式,所以它还可以大批量的生产。就说你你要什么你就告诉我,就好像我这有个类,然后你把这个信息给我,说你要什么样的产品,我就给你输出去就可以了。只要你拥有这个工厂对象,你就可以想要什么就拿,什么就玩。至于他怎么创建起来的细节,被我封装起来。被我封装起来好的,那明白这个工厂模式以后呢,同学们我们就用这一个简单工厂模式,对前面创建披萨这个代码进行一个改进,那同学们现在呢,我们打开这里,我们就开始来玩这个东西了啊首先第一步我们。
02:04
创建一个工厂类,也就是说现在在这个基础上呢,各位同学请看啊,注意听讲,Simple。我simpley。那这个就是我们一个工厂类,待会儿这个工厂类呢,我会给到orderder披萨,Order披萨二,Orderder披萨三,也就是说我们这个订购这个呢,不要再跟披萨发生联系,你都跟我simple factory发生这个依赖就可以了,我在这里给你一个,就是你要定什么我给你就行了。我给你就行了,说到时间呢,我们这些依赖就不在这儿了,他就到哪里来了呢,哎,他就去用它,就说我们每我们每一个需要去定定这个披萨的呢,只需要让他找我们这个工厂内就可以了。这个工厂类里面呢,就完成了,对,诶这个为什么拿不过来哈,是这吧。
03:06
这样这样子好好看一点,好吧,我拉到这来,这样子大家一看就清晰了这个思路,就说你就说我们这个地方也不需要管它了,这这些都没有了啊,这些都没有,不要让他跟到处都发生联系,明白了吧,你看是不是就很简单了,就说我们这个工厂内呢。我们这个工厂类里边就是你要定,你要定这个披萨你就找我。你找我,我就给你就完了,你不要说你要去联系他,你说没必要。不然的话,这个线就111堆一堆的了,肯定就不清晰嘛,那我现在呢,这个simple battery我先写出来,大家看一下就明白这个设计模式的精妙之处,好吧,我写个simple factory看清楚了。Simple factory。呃,那么这个我看看这个图标没有了啊,哎呀,这个。
04:00
太讨厌哈,这个这边这个类图呢,他做完了过后需要马上保存一下,不然的话他就马上就没有了啊好,这次我在这次我小心一点哈,把它拿过来。拿过来。拿过来好,我把这些线线先断掉。我不着急,这这次呢,我小心点,因为这个类图它有个毛病,就是你不保存,你切你切换一下它就找不到了。很讨厌。好,也就是让他们要去订购的话,直接找他。找他。找他,那准确的说呢,我们这个依赖关系,我们就可以把它换成一个聚合关系,我就我就直接写哈,我用这个关系来描述。就是把把它装到这里面去,就是给每一个order披萨的这个类呢,给他给他一个simple batter,诶这个图画错了。我们前面是不是讲过这个聚合呀。
05:00
诶,就是给orderder披萨1ORDER披萨2ORDER披萨三,一个什么呢?一个简单工厂。这样的一个关系,然后让simple factory完成这样一个,呃,就是定披萨或者叫生产披萨的这么一个任务就可以了,来保存一下。保存一下,好,同学们,那现在呢,我们simple simple factory,我开始写一下啊,非常的简单,并不难。这写个叫做简单。简单工厂。A、简单工厂类。那简单工程类它怎么写呢?非常的简单,我就这样写public OK,他可以给我返回一个披萨。啊,至于这个披萨是什么,你呃,你自己看着办啊,根据你的需求,我create一个披萨。一个披萨。好,那么这个时候呢,你把一个类型给我就可以了,比如说你你这个披萨的类型是什么,我在这来写好,我提示一句话,就说这个方我提出叫使用简单。
06:02
简单工厂模式,OK,使用简单工厂模式,那这个披萨还是。跟前面一样,我这这段代码就可以这样写了,来,我偷个懒哈,前面boss这个orderp上里面有订购的这一系列的动作吗?我拿一个过来用一用,好吧,我拿一过来用一用。好,当然这个地方我们就看写成什么形式比较好哈,就这样子吧,Order,我看看怎么写比较好,Order把这个类型拿过来吧。好,这样子比较合理。这样因为我这做完了过后我就返回就行了。这样写。Order就是这个类,那我这也叫order type,好吧,Order。Type就是你把这个。订购的类型给我,订购类型给我呢,我根据这个情况,比如说你是希腊披萨,我在这个地方,我也不在这输出信息了,名字我当然可以给他哈,呃,这个地方披萨我在上面定一个定一个披萨披萨。
07:10
Pizza。等于先来一个空啊,先定一个。啊,先定一个啊,这个是一个返回类型嘛。Pizza。返回类型。好,那这一个返回类型过后,我们可以看到,这时呢,因为我们这个没有引入披萨,所以他要报错把披萨引进去,引进去过后。嗯,这边我们就不要了。A 11这个我就不要。直接,因为我这不是一个外循环,我就直接return一个披萨。大家看这个思路好,什么思路,大家有没有发现他这样子的,我们这个思路这样子的就说。你给我一输入一个订购的类型。你给我输一个预定的一个类型,然后呢,我创建一个披萨。给你返回就可以了。那当然有一种可能性,就是他没有,是不是他没有,他没有去,呃,没没没有没有输对,比如他订订购的类型呢,不是break,也不是Che,也不是paper,怎么办呢?那就是空。
08:15
明白了吧,所以说我们这个地方就提供了一个方法干什么呢?根据根据order type。Order type,返回,返回对应的一个实例。披萨对象。披萨对象。就可以了。好,那大家看到这这个simple factory我们就写完了,那simple factory写完过后,我们到底是给谁用呢?我们这个工厂内给谁用呢?我们这个工厂类其实是要给这个用的。啊,给哪个用。实际上根据刚才这个画图是要给我们的order披萨去用,所以说现在呢,我们来看怎么让order pizza萨这个类去聚合一个simple bay。
09:00
Simple factory,好,非常简单哈,非常简单,这样去做就行了。怎么写呢?找到order披萨。这面的代码我们就先暂时不要了。因为这个已经用这个方式不好,我们就不用它了。不用它过后下面呢,我们怎么来玩呢。好,首先我先定义一个简单工厂对象,简单工厂对象好,简单工厂对象就是simple。Simple factory。对吧,然后这个symbol。Simple factory呢,我们就写个S就可以。好,初始化呢,不给值,默认为空,现在呢,我们再来给他一个晒的方法。给他一个set方法,就public void set一个factory。就设置一个工厂给他,这个工厂就是simple factory。就是我们这个简单工厂,简单工厂呢。
10:00
在这儿加进去,上来过后怎么做呢,我们就。这样去完成就可以了。首先。我们有去定一个order type就是你。你要订什么样的披萨,你得告诉我,因为我工厂呢。我这个工厂对象并不管你你是什么类型,你给我什么,你给我一个auto,我就给你返回一个对应的披萨就行了,所以说这个呢是由用户输入的。这是用户输入的理解,我的意思吧,就是好像他订单他会输一个,我要定什么样的东西好订完了过这个做完过后呢,我们这个this.simple。就是从这边传进来的。就是设置一个披萨给他。啊,设置一个工厂啊,设置一个工厂对象。工厂对象,但是简单工厂对象了。简单功能对象。那这个简单工厂对象你给我了过后,下面是不是我就可以用这个简单工厂来获取到一个对象实例,是不是这样子的?好,那现在这个问题就很简单了,我可以这样来做do。
11:11
度while循环。外循环还是跟以前一样,因为你可能订购的东西是反复的订购,所以我现在呢,先在这。做一个披萨,因为你最终肯定是要有个披萨的嘛,所以说我在这个披萨能订到外面去披萨。PI。做一个属性初始化,给他一个空。初始化,给他一个空。好的,那他拿到这个空过后,我们怎么来玩呢?他怎么来玩呢?我们都循环,首先我们先获取到这个用户,他想订购怎样的。怎样的一个,呃,这个披萨类型,就是说获取到他要用户想获去订购的这个披萨的类型,达到这个类型以后,好,现在呢,我们这样子调一个方法就可以了,同学们看到simple。
12:07
这个我们现在这个simple this simple。Factory,这个对象我们已经有了,对不对?有了这个对象,跟我们直接调查的create披萨,把这个类型传进去,同学们想,此时此刻是不是这个披萨我们就拿到了?是这样子吗,同学们?是不是拿到了,当然这里面这个代码它怎么去给我们创建的,你就不用管了,因为我们已经把创建对象实例的细节封装到create p3里面去了。好,那这个时候这个披萨拿到了过后,你就可以输出输出这这个披萨的一些信息。因为这个披萨输出信息呢,是由你来决定的,你要输,你要输还是不输是你的事,我就加一个判断,如果这个披萨它不等于空,说明什么,说明我们预定成功了,就是我们订购成功。
13:00
订购成功就是就说你这个披萨是是有的,然后我就把它披萨的一系列信息输出来就可以了,怎么输出的呀,是不是第一个就是我们准备原材料。第二个就是我们的一个home贝。第三一个就是我们的切割,还记得吧,第四一个要输出信息,就是我们的打包啊,这个时候我们就相当于说拿到了。那如果说他返回的就是这个工厂。简单工程给我们返回的这个披萨,它。就是等于空,说明什么问题呢?说明你这个create披萨并没有返回一个呃披萨对象实例,而是没有返而是空,而是空,就是都证明你这个预定失败了,那就。打印一句话嘛,提示他一下就说,呃,订购披萨失败,或者叫没有这个披萨。我就写啊,订购订购披萨。披萨失败。
14:01
呃,失败。这个失败的话,你有两种选择,就是让他继续再去选就行了,那我这就简单处理一下,我就break了好吧。Break,那这个地方我们就就完成这个事情了,Set factory这个过程中我们就把它做好了。好的,那现在呢,同学们想你,你这个side backy总是要调用一下才可以的,对不对,好,那我现在呢,写一个构造器,构造器干什么呢。构造器。这个。把这个构造器怎么写出来public?我们构造器呢,还叫order披萨,这个是没问题的。然后在这里面我们拿到过后,在这里调用一个方法叫set构造器件呢,会接收到一个。简单工厂对不对,他会接触到一个简单工厂,然后呢,我们在这里调用set方法。Tree。啊,Set factory,然后把我们拿到的这个simple factory传给他就可以了。
15:05
为什么要这样呢?因为你想一想这个工厂哈,这个这个简单工厂呢,你事先可以给它复制好,你也可以在调用过程中给他复制好,这这都有,这都可以。这都可以,因为将来这个工厂也有可能改变。也可以改变,既可以聚合也可以,因为我现在用的是一个聚合的关系,如果你要用组合的关系呢,你也可以直接在这溜一个,也也可以,也可以,就看你的思路是什么样子的了,我这里用的是聚合关系,所以说这个simple factory呢,是从外部给他传进来的。就说我定一个order pizza,再把一个simple factory。这个呃,工厂对象给他传进来就可以了,好的,那这样就写完了,写完过后呢,我们来用一用好用一用,显然这个时候这个就不好使了,我们要用第二种方式来调用。
16:01
第二种方式,怎么来调用我们的这一个简单工厂呢?那就变成这样子了,我们来写使用简单工厂模式。啊,简单,工厂模式非常简单,那就这样写六一个order。Order披萨,然后呢,把我们这个简单工厂对象给它传进去就可以。好就可以,然后这边我们提一句话,就是如果退出的话,我们就说退出了,退出了程序。同学们看。我们我们这样做的话,这个思路就这样子的,Order披萨是我们去客户端,就是使用,相当于它是使用我们。使用我们这个功能的,使用我们这个功能的一个一个位置,那么simple factory呢,是给我们创建这个产品的一个对象,那这样子的话呢,同学们可以可以可以想象哈,那以后。针对这个图,大家可以看到,将来我只要改这一个地方。
17:03
我改这一个地方,我我我加了一个,我加了一个新的这个产品加进去,我在这个地方动一下其他order披萨。只要是涉及到订购的地方,都不需要改变,所以这个还是比较方便的,那同学们我们运行一下,看看运行的效果怎么样,好来走一个。在这里呢,我们先来运行一把。运行起来。首先它提示我们。输入一个种类,好,输入种类我们就用Greek。好,希腊披萨走,他说使用简单工厂模式完成了披萨的一些这个希腊披萨的一个处理,我们再来写一个,呃,切披萨。其实呢,是我们的奶酪披萨,诶,你看也是使用简单工厂来完成的,那同学们可以看到,假如我输一个不存在的披萨,比如说paper。Paper是一个胡椒披萨,胡椒披萨我们看看有没有呢,有回车。
18:03
胡椒披萨我们也有了是不是,那我假设呃,再加一个呃,其他的披萨,比如说是。呃,餐饮中国的一种披萨,制定的一种披萨,一会车。大家看还是用简单披萨,但是呢,订购失败了,我没有这个中国的同学们看。这个简单工程模式的扩展性,我们再来聊一聊哈。同学们看,假如现在呢,我们新增了一个披萨。新增加一个P,我我我们就不去演示了,因为刚才这个已经说明这个问题了,大家看啊,假如我们这个order披萨,订购这个orderder披萨的地方很多。我们加一个披萨以后,比如说我加了一个。Chinese。Channel。CHIA。披萨PPI。这披萨,那我仍然是让他去继承这个披萨。
19:03
那我继承完了诶。这个怎么回事儿啊?这是连错线了,刚才。连这个线。我让他仍然是继承这个披萨,然后我把里面的方法。这个prepare方法重写,重写完了过后,我只需要干什么呢?把这个simple factory就这个地方加进去,一句话是加进去哪一个呢?就是说我们现在有一个新的披萨种类进来了,让这个简单工厂知道就可以了。也就是说,我们只需要对简单工厂做一个修改,而去使用简单工厂的order披萨。Order披萨二,ORDERP33不需要做任何的改变。不需要做任何改变,好的,那同学们应该大致也就明白我们这个简单工厂的一个一个好处了,对吧,一个好处了,好同学们,那通过这个案例呢,我们就把简单工厂给大家讲解到这里。
我来说两句