设计模式-工厂模式

工厂模式

工厂模式是Java中最常用的设计模式之一。在我们悉知的Spring中源码中的bean创建就是使用了工厂模式;这种类型的设计模式属于创建型模式,他提供一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

使用场景

  1. 日志记录器:记录磁盘信息、业务事件、访问服务器信息等,让用户来选择日志记录到哪里。
  2. 连接服务器使用不同的协议,POP3IMAPHTTP三个协议可以用同一个接口来实现。

优点

  1. 当一个调用者想创建对象时,只需要知道对象名字即可
  2. 扩展性高,如果需要增加新的类品,只需要新增一个工厂类即可
  3. 隐藏产品的具体实现,让调用者只关心接口

缺点

每次新增一个产品都需要新增一个产品工厂类,增加了系统复杂度。

实现

工厂模式在Spring源码中的应用解析:

我们知道在Spring中,如果我们想要通过容器去创建一个bean就需要调用一下代码来实现bean创建。

1
2
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationMain.class);
TestIOCImpl bean = applicationContext.getBean(TestIOCImpl.class);

其实ApplicationContext创建bean就是使用到了工厂模式。在上面的代码中,我们并没有显式的通过new去创建一个TestIOCImpl,通过调用applicationContext.getBean()传入一个bean的class来实例化;具体创建过程则交给了ApplicationContext去实现了。

首先来看看ApplicationContext整体的继承关系,也就是工厂模式的继承关系

ApplicationContext.java

ApplicationContext接口继承了一个最顶层的工厂类BeanFactory,来继续看看BeanFactory中有些什么方法呢。

BeanFactory.java

看到这里是不是就会有点想法,我们在上面的代码中调用的getBean(Class class)是不是就是调用的这里的方法呢?具体实现那肯定就是在子类中去实现的喽。因为我们一开始的代码是

1
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationMain.class);

创建的ApplicationContext接口实现类其实是AnnotationConfigApplicationContext类型,那么在AnnotationConfigApplicationContext类中是不是也实现了getBean的一些方法?实际上spring并没有在AnnotationConfigApplicationContext中去实现这些方法,而是通过一个抽象类AbstractApplicationContext来实现了ApplicationContext接口中的getBean一系列方法。这样做的目的也是为了提高后期的扩展性,毕竟spring这么强大,扩展性肯定是必须要很强的。

AnnotationConfigApplicationContext.java关系图

AbstractApplicationContext中实现getBean系列方法的代码:

getBean(...)代码实现

以上就是在Spring中创建Bean所用到的工厂设计模式。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信