00:00
同学们,我们来看一下用工厂方法模式怎么去解决披萨项目的这个新的需求。就说什么需求,我们在说明一下,就是客户在点披萨的时候呢,可以点不同口味的披萨,呃,而且是带地理的,比如北京的。奶酪,北京的胡椒,伦敦的奶酪,伦敦的胡椒披萨。那现在首先我仍然是画一个类图来。说明我想怎么去做,打开我们的eclipse。那现在呢,我们在这里新建一个。新建一个哈,那这个地方我们就在这儿建。在这儿新建。新建的时候我们把这个名字改一下,现在呢,把这个simple。改成我们的方法啊,工厂方法模式factory。Factory,然后呢,Method方法,也就是说这个。呃,工厂模式呢,是在方法这一块进行一个抽象,好,我们来往下走。
01:06
那现在仍然是先画一个图,先画一个图,先把我要。想做的事情给大家描述一下,来,我要走。好,那这个图呢,我我就有一些内容呢,我可以用前面图拿过来用,我就再用一下好吧,这块我是需要用的。这块我需要用。然后呢,我把它粘贴复制到这边来。好,披萨仍然是有prepare BA cut box,这个制作流程没有发生变化,那现在呢,我们这个地方要改了,它首先是北京的。北京的奶酪披萨。好,还有还有北京的什么呢?北京的胡椒披萨是吧,Paper。披萨。然后还有伦敦。这个我就复制一下。伦敦,诶。
02:00
把这个字复制一下就可以了。伦,哎哎,算了,这个不行,我们就在这直接改,这个就改成伦敦的奶酪披萨。大家跟着我的思路,伦敦就简简单这样写一下。好,那么还有伦敦的胡椒披萨,是不是写到这伦敦的胡椒披萨,伦敦paper?PEP,好,如果我仍然干什么呢?我仍然让这几个子类。去实继承我们的。呃,那个披萨这个类。没问题。诶,这个怎么挂不过去了,OK,那接着我们再来看。我们这个工厂方法模式会我会怎么去做呢?我会这样来做,我会有一个类。叫order披萨。Order披萨。那么这个order披萨里面呢,我会有一个抽象的方法,我先写到这儿。
03:01
这个抽象的方法是create。C、披萨。这个跟前面一样,返回的是一个什么呢?返回的是一个披萨。但是这个方法我要把它做成抽象的,就是在order披萨这个类里面呢,有个叫create披萨,这是个抽象的,然后我我让谁来实现呢?各位同学我要写一个类。这类呢,是这样子的,我也写一个叫北京。Beijing order pizza。北京就是在订购北京的这种披萨。还有。盾订购伦敦的。这个披萨的一个类伦敦。然后怎么办呢?各位朋友,我让。我让这两个类来。继承他。继承的,然后这个北京order披萨呢,它只关联。
04:00
这两个或者依赖北京相关的披萨,而伦敦的order披萨呢,只跟我们的伦敦相关的披萨进行一个依赖。就是这样的一个操作好的,那这个这个设计方案,大家有看到一个核心思想是在哪里呢?就是他把这个创建。其实你可以把这个看成好像是以前的简单工厂里面的那一个credit。Create披萨只是我的名字呢,换成order披萨了,我把它做成一个抽象的,然后因为我不知道你,因为因为我我要把这个创建披萨的这个行为下沉到它的子类,所以说我分别让北京orderder披萨和伦敦orderder披萨来继承我们这个orderder披萨的这个方法,那这个方法因为是抽象的,说说create的披萨,披萨呢,会要在分别是在这两个子类里面实现,也就是说他们把创建。
05:00
这个对象实例的行为呢,往下移动到自己子类去实现,那你这个子类跟谁关联,你就去依赖相关联的这个披萨类就可以了,它是这么一个思想,好,这是他的一个思想,那现在呢,同学们,我们就来。编写这个代码,编写的代码OK,那有些呃呃,有些已经有的,我就直接拿来用好吧,比如说像披萨,披萨这个先写一个,那披萨原先在这地方不是有有这么几个吗?好,我把这个改一下。好,这个披萨类是有的,我分别写四个披萨来继承它,好吧?也比较简单。也比较简单,我们快速的写一把就可以了,走第一个,首先我们写北京。被北京的奶酪气死。这是披萨。披萨,OK。好,然后呢,这边我们来继承,根据刚才我们画的这个类图对不对,继承这个披萨,然后这里面有一个准备。
06:08
好,这边我就打一句话就可以了。叫干什么呢?北京的,我们写一句话叫北京哈,北京。北。要呃,应该写写什么啊。给应该是嗯,北京的奶酪。对吧,奶酪披萨准备原材料。披萨准备。准备原料,准备原材料,同时我们把名字呢,设置也到这儿,在这儿给设置进去下,在内蒙。因为它的类里面有一个方法叫s name,我这直接写一个叫北京奶酪披萨。名字我就在这设置就完事了,同样另外几个呢,以此类推,我就快速的写一下,好吧,这是北京的什么呀?胡椒披萨。Pizza。
07:00
好的,北京的,呸。Paper。披萨,好,现在呢,我就从这边粘贴复制一份就可以了。好,往这复制一下,然后这边的话仍然要继承这个披萨,这个没问题,跟以前是一样的。然后把这个方法呢复制一份,改一下,这是北京的胡椒。胡椒披萨这边改一下,叫北京的胡椒披萨。后面还有两个伦敦的对不对,按照我们的类图来依次实现就可以了,伦敦。伦敦的胡椒。披萨。OK。然后呢,让这个类呢,也去实现我们的这一个披萨,然后把这个方法写一遍,这是伦敦。伦敦的胡椒。这边是腰杆,一下是伦敦的胡椒。
08:03
披萨,好的,那紧接着我们再来写,还有最后一个是伦敦的奶酪披萨,是这样子吧,伦敦。一一切实这个披萨。好,那这边呢,我们仍然去继承。继承一下这个paper就完事了啊,披萨就完事了,然后改一下这边改成伦敦的奶酪。这边改成伦敦的奶酪披萨。啊,伦敦。好的,同学们,现在我把这五个类就写完了,这五个类就是分别对应我们上面的披萨,现在呢,我要写个orderder披萨。Orderp上里面下面有两个子类,那大家看我怎么去完成,首先我们这边仍然写一个包叫order。对不对,仍然是个比较叫order,那order里面呢,我们原先这里面其实已经有一个order披萨了,我拿来用一下。
09:02
拿来用一下,当然这边我要改变哈,我要改变。那么我我这里准备怎么去改呢?像这些我我就不要了。这些我就不要了。对吧,这个我就不要了。啊,这我看哪些可以不要,哪些可以要的哈,我看一下这边怎么去处理,会让我们的代码的感觉更轻松一点,呃,这些,嗯,这个肯定不要。这个肯定不要,我现在这样写吧。写在构造器里边写一个。写一个订购的一个功能,那我怎么写呢。呃,披萨还是这个披萨,实际类型还是这样子的,Do,这个没问题,创建好,我现在准备这么做了。我先把这个,嗯,这些不要,先暂时注销一下。可能有些地方需要呢,我就拿来用好吧。其中,我首先需要定义一个方法。
10:00
第一个什么呢?定义一个抽象方法,哪个方法呢,就是create。Create披萨这个方法我定到这来。Create披萨这个方法,这个抽象方法干什么呢?就是让各个工厂子类,工厂子类自己实现。啊,自己行,那我把这个方法写到这abstract。Abstract返回一个披萨,然后create。披萨。那这个地方呢,我们仍然是把这个order type给它传进去。好,这个地方呢,就这样写的。呃,我们看看这个地方,它返回。是only OBS,好,那这就意味着我们这个类呢,各位朋友也需要是一个抽象的了。对吧,这也是我们原先。呃,预计上去实现的好,这个方法有了,下面这个也有了,那这块。订购order披萨,这里面这个方法咱们怎么去实现呢?前面这个是可以的,Do拿到一个练习,拿来order type,如如果等于,那这个地方就不要了。
11:10
这一块因为我已经拿到order type了,所以他创建这个流程。大家可以看到创建这个流程呢,我们就。不要怎么做呢,我们在这里直接调用。调用这个create披萨这个方法。那有时候说有些同学可能说了,说这个create披萨不是一个抽象的吗?没关系,因为这个create披萨它会由自己的子类工厂子类去实现,是不是我们要的就是它嘛,所以说这样接收就完事了。大家再看这个思路是什么样子的,那这块我们就不要了。大家再把这个思路捋一捋,我这,呃,我干脆把这个方法提到上面去,这样好看。叫上面去,这样好看。大家看,就说我们这个。Order披萨这个构造器里面呢,它完成了一个订购的任务。
12:04
但是订购的在定在创建或者叫订购我们披萨的时候呢,这个方法在我这个在本类是一个抽象的。是一个抽象的方法。是一个OBS方法,那么至于这个create到底怎么去创建,由我的子类去完成。当子类调子类去。怎么写的,那create披萨就掉什么方法就完事了,明白这意思吧,说这地方是个抽象的。抽象的抽象的方法,那么根据实际上呃,由谁来实现呢?由子类。有我们子类。由。子类工厂工厂子类或叫工厂。工厂之内完成。好,就这么一个意思,那现在呢,我们把两个工厂子类写一下,刚才我们已经分析出来了,就是在我这边呢。先保存一下,在我们这边啊,这个order地方啊,没问题了,那大家可以看到在我们这边还有北京order披萨和伦敦order披萨,没有写,这里面就会把create披萨给具体实现。
13:15
具体实现好的,那现在呢,我们仍然在order这边写上两个类,一个是北京。对,北order pizza。OK。北京order披萨,那这里呢,我们来继承。继承order披萨这个类。这里面呢,有一个抽象方法需要我们具体的完成在这里好了,那同学们想一想,你现在这个是北京的2P3,那你是不是就应该根据你的情况来进行一个创建呢?所以说这个代码呢,我就可以这样去写了,来看一个首先。呃,我们在这写就可以披萨。OK。
14:01
比默认给一个空。根据判断来走,如果我们order披萨点equals。如果它是什么呢?如果他说我要定的是奶酪类型的,气死。那我自己自然就知道,因为你这方用的是北京alder披萨,所以说我就知道你这儿要返回的是北京的奶酪披萨这种类型是不是,所以说披萨就等于六一个北京的,诶这写错了,北京的奶酪披萨北京。Cheese披萨就完事了,那LE如果它的这个订购类型。它的这个订购类型是胡椒的。Paper,那我们也知道,因为你现在掉的是北京order披萨,那肯定是北京的胡椒披萨了,对不对,那叫披萨,等于又一个北京的胡椒披萨。
15:02
北京的胡椒披萨。好OK,那整个这个做完以后呢,我们把它返回就可以了。把返回就可以了。好的,那这就是我们代码,那么看这边是有什么问题。哦,他说没有办法返回,那说明我们原先北京的这两个披萨没有去继承,他是不是肯定是要继承,诶是继承的呀。记着这个披萨,为什么他说不行呢?再来看一下。哦,OK,原原因是这样子的,这个地方包没有引引,对,因为我待会我当时拷贝过来的,所以说他还以为是以前那个我们应该选的是工厂方法,这个包包里面的这个披萨好,这样就没问题了。好,OK,保存。那保存过后这个地方我们看。比萨操作。呃。C。
16:01
我们看看是不是他的副类这个地方也还没改啊,所以有时候粘贴拷贝有时候会比较麻烦哈。好,我们来看一下。果果然哈,这个披萨他仍然用的是simple factory里面那个披萨,所以说他认为不是同一个,我重新再引一下就没事了,用的是bagy method这个包里面的披萨。好保存。好的保存完了过后呢,这个时候再来看北京,这个他就没没有错了,因为现在他的披萨呢,都是我们bay method这个包里面的披萨就没事了,这个地方大家要注意一下,好北京的order披萨这个我们就写完了,也就是说这个就写完了,伦敦一样的来,我们把伦敦呢复制一份就可以了。改一下伦敦。对,伦敦的。伦敦的奥匹萨。这个类。OK,改一下。那伦敦这个orderp上我们要怎么改呢?好,这边地方呢,我们创建的就不是北京的。
17:04
这个奶酪披萨,而是伦敦的。伦敦。OK,伦敦的奶酪披萨没问题吧?同样的道理,这边呢,也要改成伦敦的胡椒披萨。没问题,好,这个代码就写完了。那同学们看。也就是说现在经过我们这番这个处理呢,我们就相当于实现了这样一个流程,把我们这个工厂类的,虽然说老师这个不叫工厂啊,实际上在这他充当的是。这个工厂的一个角色,那下面是两个工厂内的。子类明白吧,所以相就把它亏的披上,这个行为呢,放到它的子类去实现的,就就这样子的,那中学我们我们来用一下,毕竟你这儿写完了,你没有使用,那么你无法证明你这个到底好用还是不好用,好老规矩我们来用一下这个。
18:01
这这咱们写的代码是否能够正常的运行,写一段代码,我们取个名字就叫披萨店。Pizza store。把主方法勾上,我们来用一下。怎么用呢,这个就很简单哈,呃,我们现在这样子,我们创建北京的,北京的这个口味,北京的奶酪,北京口味。口味的各种披萨。因为这个披萨是什么还要由你来决定是吧,我就留一个北京。Orderer披萨就可以了,Orderer披萨就可以了,好的,那现在呢,我们来预习一把。我们运行起来,来看一下。同学们可以看到,他先让我们去输入披萨的种类,现在比如说我说的是奶酪。同学们看,因为我现在调的是北京order披萨,所以说他自然会给我们产返回北京这个口味的奶酪披萨。如果我输的是paper。
19:05
OK,那现在呢?他自然给我们返回,是北京的胡椒口味的披萨,因为我用的是。北京的order披萨,那当然有同学说老师,假如我现在呃想想用这一个,呃,想去吃下伦敦口味的呢,那你这个是用用的是伦敦的order披萨就行了,说老师我想把两个再整合一下,怎么办呢?那你让这个用户输的时候呢,先输你是哪个地方的,再输是哪个口味的,最后决定掉哪一个order匹萨不就完了吗?是不是这样道理啊,同学们很简单啊,就是你也可以把它合合起来,我这就没合了,就创建伦敦口味的。伦敦口味的各种披萨,我这披萨就两种。披萨,OK,那六一个伦敦。Order披萨就可以了,好,那现在呢,我们来玩一把,找一个好同学们可以看到。
20:01
在这里呢,我们写一个介。好,这是伦敦的。如果我们输paper。Paper,好,这是伦敦的呼叫,当然有同学说说我现在,呃,北京客户那个合起来怎么办呢?那也很简单哈,你可以这再来接收一个,比如说。比如说你在接收一个地理位置local。对吧,Local你说哎,你先输一个地理位置,然后根据地理位置再调嘛,比如说我这写的是你输的是北京。好,那我可以这样写。这样写,如果,如果地址点E。对吧,我我就简单写一下啊,如果是北,他说的是北京,那么我们就调。这个是不是是不是这个意思啊。当你这边还可以把它封装一下,我这儿就没有风了。在六伦敦的。伦敦。伦敦的order披萨,这就把它分开了,就把它分开了,对吧,所以这这就合合起来了,那这这边这边呢,就是创建的。
21:07
创建,诶写到这创建北京各种口味的披萨,而这边呢,就是创建我们伦敦的各种口味的披萨,不就完事了吗?然后你再把这个local做成一个输入,就是可以通过通过这个点就是外。呃,外部或者通过一个控制台输进去来控制这个local的值就完事了,对吧,你看我运行起来,现在他走的是北京。啊,这个这个地方,你因为我这是北京那匹配到这来了,所以说你看我写个Che。他返回的是北京口味的,对不对?好,这个我就不演示了,各位同学那关于工厂方法模式的,它这个应用的案例呢,我们就给大家讲解到这里,下面这个也是这个类这个分析啊,刚才的思路类图,还有代码实现,我们都给大家走完了。
22:00
都给大家讲完了,那各位同学关于工厂方法模式的讲解就给大家介绍到这里。
我来说两句