第四章 工厂模式 Factory
创建型设计模式
定义:
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类
类图:
应用:
- 当一个类不知道它所需要的对象的类时在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可
- 当一个类希望通过其子类来指定创建对象时在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展
- 将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中
Spring中的FactoryBean,就是使用工厂方法模式
FactoryBean
Spring 中为我们提供了两种类型的bean,一种就是普通的bean,我们通过getBean(id)
方法获得是该bean的实际类型,另外还有一种bean是 FactoryBean
,也就是工厂 bean,我们通过getBean(id)
获得是该工厂所产生Bean的实例,而不是该FactoryBean
的实例。FactoryBean
是一个Bean,实现了FactoryBean
接口的类有能力改变bean,FactoryBean
希望你实现了它之后返回一些内容,Spring会按照这些内容去注册bean。public interface FactoryBean<T>
,提供如下方法:
通常情况下,bean无须自己实现工厂模式,Spring容器担任工厂角色;但少数情况下,容器中的bean本身就是工厂,作用是产生其他bean实例。由工厂bean产生的其他bean实例,不再由Spring容器产生,因此与普通bean的配置不同,不再需要提供class元素
BeanFactory
是一个接口,public interface BeanFactory
,提供如下方法:
在 Spring 中,BeanFactory
是 IoC 容器的核心接口。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。BeanFactory
提供的高级配置机制,使得管理任何性质的对象成为可能。ApplicationContext
是 BeanFactory
的扩展,功能得到了进一步增强,比如更易与 Spring AOP 集成、消息资源处理(国际化处理)、事件传递及各种不同应用层的 context 实现(如针对 web 应用的WebApplicationContext
)。用的比较多的 BeanFactory
的子类是 ClassPathXmlApplicationContext
,这是 ApplicationContext
接口的一个子类,ClassPathXmlApplicationContext
从 xml 的配置文件中获取 bean 并且管理他们,例如:
public static void main(String[] args) throws Exception { BeanFactory bf = new ClassPathXmlApplicationContext("test.xml"); Test testBean= (Test) bf.getBean("testBean"); testBean.print(); }
XML配置如下:
<bean id="testBean" class="com.Test">
<property name="name" value="Tom"/>
<property name="age" value="18"/>
</bean>