00:00
Java设计模式的工厂设计模式,我们来学习一下。那么我们在学一个模式的时候呢,往往是先通过一个具体的需求来引出我们要讲解的这个设计模式。好,同学们先看一个需求。这个需求呢,是一个披萨订购的项目。呃,他有这样一个要求,便于PC种类的扩展,同时呢,还要便于我们对这个项目的维护,具体要求有这么三点,第一点呢。披萨的种类很多,比如说Greek披萨、希腊披萨。切实披萨,这个是奶酪披萨。还有胡椒披萨等等吧。披萨的种类很多,那么他告诉我们披萨的制作的流程呢?它是比较固定的,比如说准备原材料。Big。这是烘制烘烤。然后呢,Cut就是进行这个。
01:01
就是cut,就是咱们进行这个切割。把它切割成可以打包的那么个大小,Box呢,就是打包。假如我们披萨的制作。有这么四个步骤。然后第三点呢,他要求我们完成披萨店的一个订购任务,就是我们把这个披萨制作起来,然后呢,完成一个订购,就这么一个。披萨订购的小项目。那同学们拿到这个项目以后,你会怎么来思考呢?来,我们先不要去想工厂模式,我们就按自己的一个想法。我们会怎么去设计?那我们来看一下。我们先用最容易想到的传统的方式来完成,那完成这个传统方式呢,首先我们要对它做一个思路分析,我们画出它的类图,然后根据类图呢,我们用代码来实现一把来,同学们打开我们的eclipse。现在呢,在这里我们新建一个包。
02:02
对,我们新建一个包,因为现在我们讲的是工厂模式,所以说我取个名字叫factory,工厂模式里面我们先讲的是simple factory。简单工厂里面我们讲的是一个披萨的香米披萨。食道,比如说这是披萨店的一个项目。放这好的,那现在呢,我们来想一想,如果让我们来设计。这一个。模块或者是这个功能,你会怎么画类图呢?来,我们一起思考,往下走。好,我先把这个类图画出来,大家看看OK还是不OK啊,OK,那现在呢,我们把这个打开,首先我们认为我们应该有一个抽象类,这个抽象类呢,它是披萨。就说我们披萨的种类不是很多吗?对不对,有很多那。我们肯定会一个最容易想到的oo编程的思路,就是我们把这个披萨呢做成一个抽象类。
03:05
这个里边它应该会有一些方法,对不对?有哪些方法呢?它披萨的制作不是有这么几个过程吗?首先是准备原材料,Prepare。是不是这样写的呀,看大家看到他这不是写写过有一个prepare吗?准备原材料好,然后呢,他还有一个就是我们叫做。Bake bake就是烘烤的意思。烘烤,烘烤完了过后呢,它的第三一个流程我们知道是切割。把这个面包切割成可以打包的大小,然后下面呢,就是我们的一个打包,最后我们就把这个披萨制作起来了。这是一个类。那我们知道披萨,人家已经说了,披萨有很多种类,所以说我们可以让具体的披萨来继承这个披萨这个类对不对,那就是他说有切实。
04:06
切实披萨。披披萨。好的,还有什么呢?还有刚才所说的叫做Greek希腊披萨,Greek披萨。对不对,比3OK,那我们让这两个类去。继承我们这个披萨。然后在我们这个子类里面呢,完成我们这些方法就可以了。哪些方法是共用的,我们可以写在上面,哪些方法不是共用的,我们让子类。自己来实现这个方法就可以了。好同学们,这个就是根据。他的一个需求,我们设计出来的一个类图。那现在呢,我们就可以把这个代码来进行一个编写,就是类图咱们已经有了,对不对,类图已经有了,类图有了,现在我们就可以按照我们这个类图的设计来完成我们这个披萨订购的小项目。
05:07
没问题吧?好,那么现在我们就开始编写。编写拉走一个。呃,我先打一个包,第一个包呢,我们把披萨相关的,就是所有的披萨放到这个包包里面去。这是一个小点。好的披萨,那刚才根据我们分析,我们有这么目前有。披萨,切实披萨,还有great披萨,来,我们写一下。走一个,首先我们先把这个披萨洗出来。写出来。那同学们也知道哈,同学们,我们在讲过这个P3呢,我们把它做成一个抽象类。把做一个抽象类。对,这是一个抽象的将这个披萨类。披萨类做成做成抽象的,这个没问题吧。
06:02
那里面有几个方法?根据刚才的分析,里面不是有四个方法吗?这四个方法其实都比较简单。那。四个方法比较简单,我再写一遍呢,比较浪费大家的时间,所以说对于有一些比较简单的,不涉及到设设计模式思想的这些代码呢,我就不写了,我就直接从我这儿准备的幻灯片把它拿过来。对于有一些难度的,涉及到我们设计模式的核心思想的呢,我跟大家写一下,大家理解我的意思吧,因为这样子每比较简单代码我也写一遍这样。特别浪费大家的时间,所以为了提高我们讲过的效率呢,我们就把不太重要的,比较简单的代码我们直接拿过来用,对于比较重要核心的,需要给大家解释的,涉及到编程思想的,设计思想的,我们。给大家手敲一遍,这样提高我们讲课的效率,好的,那这个类我们就不写了,我已经把它准备好了,来看一下。
07:04
OK,我复制一下。把这个格式化一把,来简单的解释一把。这个是披萨的名字,就是你具体。是希腊披萨还是这一个?呃,奶酪披萨,你到时间给个名字就行了。这是。这个是什么呢?这个是披萨的名字。Ready吧,那大家可以看到这有一个方法叫prepare,这个是干什么呢?准备OK,他是准备制作。准备原材料。原材料,那么原材料大家都知道,不同的披萨原材料是不一样的,比如说你是奶酪披萨,你要准备奶酪,如果你是希腊披萨,你可能准备的是另外一种原材料了,对吧?所以说准备原材料呢,不同的披萨。披萨是不一样的。Pizza。
08:00
哎。披萨不一样,不一样。不一样。因此,因此我们。我们干什么呢?我们做成,我们把它做成一个抽象方法。抽象方法就可以了。好,那下面这个大家可以看到这个贝壳是。呃,这个烘烤,烘烤呢,我们认为流程大同小异,所以说我们就把它实现了,这个是用来烘烤的,这个是切割。就是对这个面包进行切割成我们可以打包的大小,下面这个是打包,这个是打包了。对,打包。那最后这一个方法叫set name,就是把这个披萨的名字设置进去,好,第一个类我们就写完了。另外呢,我们根据这个类图设计,下面有具体的披萨了,我们把这两个披萨写一萨来走一个,第一个呢,是我们的奶酪披萨,切实。披萨,OK。
09:02
我们让这个切披萨呢去继承。对,继承我们刚才写的披萨这个抽象类。披萨这个抽象类里面呢,有一个方法需要我们重写,哪一个方法就是准备原材料的方法,所以说我在这呢写上一句话。我这儿提示一句话对吧。说。准备什么呢?准备。给谁呀,给奶酪?就是准备奶酪,给奶酪制作制作。制作奶酪。哎,奶酪披萨准备。披萨准备什么呢?准备材料,原材料。好,这样就行了。那紧接着我们是不是还有一个披萨呀,还有批萨是希腊披萨,我们也写一个提示,那希腊披萨GRGK。
10:00
披萨。就是现在我在用什么方式来解决呢?用我们。容易想到的这种比较传统的方法来解决,就说没有用设计模式的明白,待会儿呢,我们可能要要来分析这种方式存在的问题,是不是好这个一样,我们也给他实现一个方法,写一句话。这是。这是干什么呢?给自。啊,给给这一个希腊披萨。希腊。披萨准备。准备原材料。准备原材料。好,这个又写完了。那同学们现在呢,我们就把这两个写完,写完以后同学们想一想,此时此刻是不是现在要涉及到我们去订购。我们要去订购这么一个啊,这么一个披萨,好,现在呢,我们来接着写下一个要去订购披萨的一个类来写一个,那订购披萨呢,我们再单独的写一个包,叫做order。
11:04
Order。就订购。好的,假如现在我们这儿有一个披萨店。有一个披萨店,它呢可以去订购我们商品,那现在我们就写个order披萨。P3 OK。这个order披萨这个类呢,它会去干什么呢?它会去用到,它会去使用到我们的这个前面写的这些个类,所以说我这就直接写一个构造器。跟上我的思路哈,构造器。那这个构造器我们怎么写呢,Public。Order披萨是吧?我们这样子来写,你订购一个披萨,说白了就是你要给我们把这个披萨准备好。是不是你就相当于说订购披萨,你根据这个不用户不同的需求订购披萨嘛,所以我就写到这里来了。首先呢,我们先。
12:01
这一个。在这儿创建一个披萨。当然这个后面我们都要改进,都要改进哈披萨。初始化为一个空。初始化为一个空,然后在这里呢,我们得到用户他想订购的一个类型。比如说这个是订,就是披萨的类型,就是订购。订购披萨的披萨的类型是什么?比如说他是要订购希腊披萨呢,还是要订购我们的奶酪披萨,我现在就在这写一个do方法。While循环。对吧,我写个Y循环,假如他可以不停的定,那除非他干什么呢?如果他输的这个披萨类型不对了,我们就不再为他订购了,那现在我开始来获取一个他的。一个类型,比如说他现在要订购的披萨是一个great披萨。
13:00
我假定哈,假定是这么一个披萨,那现在呢,我就做一个判断。我判断什么呢?如果他这一个订购的披萨类型就是希腊披萨。假如是希腊披萨,假如是希腊披萨,这时呢,我们就让我们就创建一个希腊披萨给他。对不对,希腊披萨是Greek。GREK。披萨。那如果他不是呢,LE,如果他订购的类型。不是希腊披萨是什么呢?好,Equals,如果它是订购的,我们的。气死,气死。CEE,比如说他订购的是奶酪披萨,好,那这个时候呢,我们就给他创建对应的奶酪披萨这个对象实例,对不对,就切实。切。
14:02
妾是什么呢?披萨就产生好了,如果说诶他假如他假如输的不是Greek,也不是切实,我们就认为我们现在没有办法给你订购这样的披萨,怎么办呢?那我就退出了。好,这个就是我们这一段代码,就是订购披萨的这么一段代码,非常的简单,那大家可以看到我在这是把它写死的,这样不利于我们的一个编程,比如说你写死这个希腊披萨,那我这个用户在订购的时候以后就只能定。希腊披萨这样不合适,所以说我这写一个什么呢,我这写一个方法,写一个方法可以干什么呢?可以动态的。可以获取获取客户希望订购订购的披萨种类。OK,种类,那这个时候我们写个方法就行,这个方法我就不写了,我这已经准备好了。我写了这么一个方法,大家看一下就OK啊。
15:02
这个方法呢?同学们可以看到,呃,写了一个方法获取用户需要订购PR种类,我在这个控制台可以接收到他的一个信息,那这个时候呢,我在这边就不写死了,我怎么写呢?我写一个get type。哎,我把这个get type给它放这这样子他就可以动态的去给我们输,输入你想订购披萨的种类,比说input披萨的种类。对吧,你要订购怎样的披萨放这我们引入相关的包就OK了。好,同学们,我们可以看到现在订购这一个。Order披萨我们也用到了。也就是说在这个时候呢。我们在这一个orderder披萨这个类里面呢,我们用到了这三个类披萨,切实披萨和GR披萨,那换言之就是我们这相当于有一个这样的类叫order。
16:03
披萨。对不对,这个order披萨这个类呢,它依赖。这个。他依赖这个,他还依赖这个。是这样子的吧,因为我们可以看到在op上我们用到了这三个三个类没有问题。没问题,好,那用到这个以后呢,我们现在来完成这个订购任务,是不是我们需要有一个什么呀,有一个。披萨店,那我现在呢,有一个披萨店,我写一个叫。披萨。Store。这个披萨呢,再去使用到我们这个。对吧,再去使用到我们这个就可以了,就说我这个披萨店用order披萨这个类完成我们现有的各种披萨的一个订购任务就行了,当然你也可以把它组合进去,就是我认为这个orderder披萨,Orderder披萨这个呢,是我的一个部分,是我披萨店的一个功能,也是可以可以把它组合或者聚合进去,这个都可以,好吧,那现在呢,我们完成一下披萨店这个类。
17:15
那走一段代码,走一段代码写一个叫披萨。P。比度。OK,那披萨store肯定是里面会相当于是个客户端了,它相当于是个客户端,这个地方相当于。哎,相当于一个客户端干什么呢,完成订购啊,发起发出。发出什么呢?订购任务,披萨的订购任务。订购。订购OK,那这个地方就比较简单了,我们直接六一个order披萨。因为在我们这个构造器里边,大家可以看到,我们只要订我们产生一个orderder披萨这个订单,那么它的这个构造器里面就完成了这个订购任务里面呢,他会要求我们去输入你到底想订购什么产品。
18:14
好的,那这样子的话,我们就这个就OK了,那现在同学们来,我们来走一圈,看看代码能不能跑起来,大家想我们在这儿完成一个订购以后,大家看我们完成一个订购以后,就是这个地方它产生了一个披萨,我们没有把它的信息输出来,这个不利于不利于我们观察,因此呢,我在这再加一点输出。输出这个披萨。披萨制作。对,它的一个制作的一个过程来吧,很简单,因为你上面已经有这个披萨了。So,那就是披萨。点什么呢?首先第一个步骤是准备原材料,Prepare问题吧,披萨准备完原材料以后呢,它进行一个贝壳,就是烘制,然后呢,披萨。
19:10
烘好了以后呢,我们进行一个切割,切割完了以后呢,诶,我们进行一个打包,打包完了之后,我们就可以把这个订购的披萨给别人送过去了,是这样子的吧,同学们,好的,那现在呢,我们来运行一下这个代码,看看能否跑起来。来运行一下。运行。好,同学们可以看到呢,他现在让我们输出输入你想订购的披萨的种类,比如说我想订购的是一个Greek披萨。好,大家可以看到我这里,他说给披萨准备原材料,但是大家看这是空的。这是空的,那这里为什么是空的呢?我们来看一下这个代码的问题。我们来看一下这个代码的问题。同学们可以看到我们。
20:01
从这里面往这追,Order order完了,这个披萨肯定是根据实际情况应该是建起来了,建起来以后我们在这里面去看一下,准备原材料。这个地方是没问题的,大家看,他说给希腊披萨准备原材料,下面呢,我们在这儿来。轰字。诶,呃,他从这个地方调用啊,并。掉进去。交进去以后,同学们看这个内是不是我们没有设置啊,你没有把这个名字给他设置进去,就说你这个产品的名字是什么,你没给他,所以说这个地方你就没有看到这个信息输出来了。没有看到这个信息输出来,所以说我们在这个做完了以后呢,我们可以加一句话,就是这个是一个怎样的产品,在这加什么一句话呢,来同学们在这写一个披萨。因为这个披萨已经创建好了,所以说我把名字给它设置进去,这是什么呢?你就写一个希腊披萨。
21:07
希腊披萨。对不对,吸了。披萨。好,我把这个呢隔一下,下面这个是什么呢?哦,同学们,下面这个就是我们的奶酪披萨。对吧,奶酪披萨。奶酪皮上好,我们再来运行一下,同学们看,我们再来运行一下。运行在我们的store这方去运行,我们再看这个效果怎么样。运行一下。好,我们先输入一个Greek。好,它是希腊披萨,我们再输入一个奶酪气。好,这边就是奶酪披萨,那如果说我们输的这一个披萨是不存在的,比如说我瞎写一个YYY,那么这个就是退出我们这个程序了。
22:08
好,同学们,那我们用传统的方法呢,就完成了这样一个披萨订购的问项目,那它存在什么问题吗?我们待会儿进行一个分析。然后再用我们相关的设计模式予以改进。
我来说两句