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的阶段,所以我没能举出在实际项目中运用这种模式的鲜活案例(有用到这种模式的朋友们希望能分享一下)。不过,这种模式的理解之后,还是比较简单的,绕的弯也就那么一道而已。同时,我在继续看这本书时,以后也会多写博客,整理一下心得,与大家共享。

  

posted on 2018-08-22 23:01  荒郊野岭一根葱  阅读(1210)  评论(0编辑  收藏  举报