文档章节

工厂模式

maozhibin
 maozhibin
发布于 2017/07/31 21:48
字数 1660
阅读 1
收藏 0

这两天突然想学学java源代码,不过看到一篇文章说看java源代码要先看设计模式,这样更容易理解源代码的结构,所以就准备学学java设计模式,首先当然是看java创建模式的工厂模式了,刚开始直接看抽象工厂模式是什么意思,百度百科的实在是看不懂,后来又在网上看了看其他的文章,仔细思考后,还算是理解了,现在跟大家分享下。
      首先说说简单工厂模式,我用现实中的汽车工厂举例子,首先有个汽车类的接口叫做Car,里面有个开车的方法叫做drive(),然后有个吉利车的类叫做Jili,实现了car的接口,还有个奇瑞车的类叫做Qirui,也实现了Car的接口(因为都是车嘛,当然能开了)。
       interface Car{
            public void drive(){
                     System.out.println("我开车");
            }
       class Jili implements Car{
            public Jili(){
                     System.out.println("生产一台吉利车");
            }
            pulic void drive(){
                     System.out.println("我开吉利车");
            }
      }
      class Qirui implements Car{
            public  Qirui(){
                     System.out.println("生产一台奇瑞车");
            }
            pulic void drive(){
                     System.out.println("我开奇瑞车");
            }
      }
那现在如果我要用Jili这个类,最基本的方式就是
      Jili jili=new Jili();
如果用Qirui这个类,最基本的方式也是
      Qirui qirui=new Qirui();
哦,那现在如果有个比亚迪车就得new Biyadi();然后同样有个drive()的方法,这样每个都得new个汽车对象,但是其实吉利,奇瑞和比亚迪他们都属于汽车,同样都有drive()方法,那是不是我们能创建一个生产汽车的工厂,然后你想要什么汽车只要告诉工厂就可以,工厂就帮你生产了,这样你不用管生产的细节工作(也就是new对象的过程),这样会更好呢,到此,简单工厂模式就出来了,简单工厂模式就是创建具有相同特征的类的实例,然后把创建汽车的方法静态化,这样就可以直接用工厂生产了,代码如下
      class CarFactory{
             public static Car createCar(String carname){
                  if("jili".equals(carname)){
                        return new Jili();
                  }else if("qirui".equals(carname)){
                        return new Qirui();
                  }else if("biyadi".equals(carname)){
                        return new Biyadi();
                  }
            }
这就ok了,这样如果你要生产出一台汽车,直接调用Car car=CarFactory.createCar("jili");就可以了。
         这种工厂虽然挺好,但是如果我每次要加入一个新车都得修改工厂类来加入新的判断语句,这样不符合开闭原则,所以慢慢人们又想出一种更加好的生产方式,这就是工厂方法模式。
         首先我们把生产汽车的工厂类抽象出来当成一个接口,
         Interface CarFactory{
            public static Car createCar();
         }
         然后呢,让具体工厂类实现这个生产汽车的接口,这样就会有三个具体工厂,一个是吉利车生产工厂,一个是奇瑞车生产工厂,一个是比亚迪车生产工厂
         class JiliFactory  implements CarFactory{
            public static Car createCar(){
                  return new Jili();
            }
         }
         class QiruiFactory  implements CarFactory{
            public static Car createCar(){
                  return new Qirui();
            }
         }
         class BiyadiFactory  implements CarFactory{
            public static Car createCar(){
                  return new Biyadi();
            }
         }
         这样做的好处就是如果我还要生产一个长城汽车,不用去修改CarFactory这个工厂,只需要再写个长城工厂类去实现CarFactory这个接口就可以了。这就是工厂方法模式,不过工厂方法模式和简单工厂模式的各有优点,也不能就说工厂方法模式就好,关键在于看实际情况去决定用哪种模式。
         随着社会的进步,汽车种类也多了,比如分为越野车和跑车两个系列,而工厂方法模式一般是针对于一种系列的抽象产品的生产,而把工厂方法模式进行扩充,变成可以对多种系列的产品进行生产,这就是抽象工厂模式了。
         百度说抽象工厂模式是创建多个产品族的产品对象,那我在这解释下什么是产品族,现在我们还是以汽车工厂生产汽车为例,随着汽车行业的发展,汽车在应用上分为越野车和跑车,这样原来Car这个接口就不能通用,而变成了YueyeChe()和PaoChe()这两个接口,而越野车适合在山路上跑,跑车适合在赛路上跑,所有drive的方法也改变了,代码如下
         interface YueyeChe(){
            public driveShanlu();
         }
         interface PaoChe(){
            public driveSailu();
         }
         而吉利和奇瑞也都生产跑车和越野车,这样大家就好理解了,跑车就是一个抽象产品族,越野车也是一个抽象产品族,而吉利跑车,吉利越野车,奇瑞跑车,奇瑞越野车是真正的类,这样我们还有四个类
         public JiliPaoChe implements PaoChe{
            public driveSailu(){
                System.out.println("我在赛路开吉利跑车");  
            }
         }
         public QiruiPaoChe implements PaoChe{
            public driveSailu(){
                System.out.println("我在赛路开奇瑞跑车");  
            }
         }
         public JiliYueyeChe implements PaoChe{
            public driveSailu(){
                System.out.println("我在山路开吉利越野车");  
            }
         }
         public QiruiYueyeChe implements PaoChe{
            public driveSailu(){
                System.out.println("我在山路开奇瑞越野车");  
            }
         }
         车的接口和类就定义好了,相信大家也理解什么是产品族了,下面我们该看工厂怎么实现了,首先还是向工厂方法模式那样,有个生产汽车的工厂接口,不过我们对这个接口进行了一些扩充,因为Car类分成了跑车和越野车,所有我们接口也就是能生产出跑车和越野车这两种车型
         Interface CarFactory{
            public static PaoChe createPaoChe();
 
            public static YueyeChe createYueyeChe();
         }
         和工厂方法一样我们需要两个真正的工厂类来生产真正的汽车,恩.....当然,吉利工厂可以生产吉利跑车和吉利越野车,奇瑞工厂可以生产奇瑞跑车和奇瑞越野车,代码如下
         class JiliFactory  implements CarFactory{
            public static PaoChe createPaoChe(){
                  return new JiliPaoChe();
            }
            public static YueyeChe createYueyeChe(){
                  return new JiliYueyeChe();
            }
         }
         class QiruiFactory  implements CarFactory{
            public static PaoChe createPaoChe(){
                  return new QiruiPaoChe();
            }
            public static YueyeChe createYueyeChe(){
                  return new QiruiYueyeChe();
            }
         }
      ok了,抽象工厂模式也完成了,大家如果想生产一个吉利跑车,就可以JiliFactory.createPaoChe();这样吉利跑车就出来了,不错吧,同理如果我们还要一个比亚迪的汽车工厂只要实现CarFactory这个工厂就行了,代码如下
      class BiyadiFactory  implements CarFactory{
            public static PaoChe createPaoChe(){
                  return new BiyadiPaoChe();
            }
            public static YueyeChe createYueyeChe(){
                  return new BiyadiYueyeChe();
            }
         }
      相信大家应该理解了什么是抽象工厂模式,不过具体什么情况该如果选择哪种模式,还需要多多学习,才能融会贯通。

本文转载自:http://www.jb51.net/article/85699.htm

上一篇: 代理模式
下一篇: 策略模式
maozhibin

maozhibin

粉丝 0
博文 4
码字总数 1353
作品 0
杭州
私信 提问

暂无文章

Hibernate 5 的模块/包(modules/artifacts)

Hibernate 的功能被拆分成一系列的模块/包(modules/artifacts),其目的是为了对依赖进行独立(模块化)。 模块名称 说明 hibernate-core 这个是 Hibernate 的主要(main (core))模块。定义...

honeymoose
今天
4
0
CSS--属性

一、溢出 当内容多,元素区域小的时候,就会产生溢出效果,默认是纵向溢出 横向溢出:在内容和容器之间再套一层容器,并且内部容器要比外部容器宽 属性:overflow/overflow-x/overflow-y 取值...

wytao1995
今天
4
0
精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
今天
7
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
今天
3
0
jenkins 插件下载加速最终方案

推荐做法 1、告诉jenkins 我哪些插件需要更新 jenkins插件清华大学镜像地址 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 1.进入jenkins系统管理 2.进入插件管...

vasks
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部