zoukankan      html  css  js  c++  java
  • java接口工厂模式理解

      作为实际java开发经验还不到一年的我,第一次写博客,诚惶诚恐,怕把自己的谬误公之于众,误人子弟,不过转念一想,若是能有同行加以指点评判,将他们的真知灼见描述出来,那这篇文章就算抛转引玉了。

       最近在阅读《Java编程思想》有关接口的最后一小节中,作者提出了工厂设计模式,用来解决---生成实现某个接口的对象。说实话,对设计模式近乎一无所知的我,看到这里会想,这也太简单了,脑子里不假思索的会写出这样一个例子:

     1 //
     2 interface Air{
     3   void show();
     4 }
     5 
     6 //悟空
     7 class WuKong implements Air{
     8   @Override
     9   public void show() {
    10       System.out.println("悟空:龟派气功");
    11   }
    12 }
    13 
    14 public class Test {
    15   public static void main(String[] args) {
    16       Air wk = new WuKong();
    17       wk.show();
    18   }
    19 }

      联想到书中提到的工厂设计模式,我这时就会想:这个模式的设计目的是什么?在什么情况下用它能发挥模式的作用?怎么写出这个模式,而不纯粹靠背的?

      1.书中的解释看的不太明白,后台在网上找了一个通俗易懂的解释:工厂设计模式是为了将对象的创建与使用进行分离。上面例子中创建了悟空对象,随机就调用了show() ,而这种模式就是在悟空对象创建和使用这两个环节中做文章。思路弄明白了,超级简单。本来流程是:生成对象a-->a.m();演变成生成工厂类b,b中的方法n(),可以生成对象a,然后a.m()。看看代码:

    interface Air{
       void show();
     }
     //悟空
    class WuKong implements Air{
       @Override
       public void show() {
           System.out.println("悟空:龟派气功");
       }
     }
    //悟空工厂类,目的很单纯,就为了创建悟空对象 
    class WuKongFactory{
         public Air getAir(){
             return new WuKong();
         }
     }
    public class Test {
       public static void main(String[] args) {
    //     Air wk = new WuKong();
    //     wk.show();
           /**
            * 随着引入工厂类,调用show方法也做了些调整,先创建悟空工厂类对象factory,
            * 重点来了,new WuKong()的操作被封装到了getAir()里面。
            * 试想这样一种情景:main()方法我们不改动它,可以自己新增修改其他类,
            * 在这种情况下:我们可以修改getAir()方法,来return任何包含有show()方法的对象(也就是实现Air接口),
            * 从而让下面的代码输出不同的结果。很显然,注释的那两行代码玩不出这种花样。
            */
           WuKongFactory factory = new WuKongFactory();
           factory.getAir().show();
           
       }
     }

      来,我们来验证一下,在main()方法不变的情况下,我们新增一个实现Air接口的八戒类,看看效果:

    //悟空工厂类,目的很单纯,就为了创建悟空对象 
    class WuKongFactory{
         public Air getAir(){
             //注意:这里不再是new WuKong()
             return new BaJie();
         }
     }
    //八戒
    class BaJie implements Air{
        @Override
        public void show() {
            System.out.println("八戒:猪猪乾坤屁");
        }
    }

      这时factory.getAir()创建的是八戒对象,于是产生了不同的结果。还有一点优化:针对WuKongFactory这个getAir()方法,其实是这个模式的核心方法,它就是为了创建你想要解耦的那个对象的实例,可以如书中的例子一样,把它抽离出来,封装成一个接口,想创建悟空或八戒对象时,就实现这个接口,重写方法创建你想要的对象。

    interface Factory{
        Air getAir();
    }
    class WuKongFactory implements Factory{
        @Override
        public Air getAir() {
            return new WuKong();
        }
    }
    class BaJieFactory implements Factory{
        public Air getAir() {
            return new BaJie();
        }
    }

      

      走笔至此,工厂方法设计模式的理解,我也就只能讲这么多,由于开发经验太单薄,而且我也处于正在学习Java的阶段,所以我没能举出在实际项目中运用这种模式的鲜活案例(有用到这种模式的朋友们希望能分享一下)。不过,这种模式的理解之后,还是比较简单的,绕的弯也就那么一道而已。同时,我在继续看这本书时,以后也会多写博客,整理一下心得,与大家共享。

      

  • 相关阅读:
    FlashSocke 通过flash进行socket通信(as代码)
    JavaScript 中的对象深度复制(Object Deep Clone)
    map,vector 等容器内容的循环删除问题(C++)
    [转]用JavaScript在浏览器中创建下载文件
    [记]WIndow/Linux 获取本机(全部)IPv4、IPv6、MAC地址方法 (C/C++)
    [记]Debian alias 设置, 不设置貌似有点不方便习惯
    Linux 安装配置 FTP 服务 (vsftpd)
    FreeSWITCH 安装配置的 各种坑, 填坑
    ubuntu编译安装ruby1.9.3,从p551降级到p484
    redmine3.3.3 rake db:migrate 报错invalid byte sequence in US-ASCII (Argument Error) 解决方法
  • 原文地址:https://www.cnblogs.com/shu94/p/9521006.html
Copyright © 2011-2022 走看看