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