工厂方法模式是创建对象的一种方式。使用场景:
- 需要频繁创建对象。且创建对象需要大量的代码逻辑
- 应用层不依赖与产品实例的创建和实现细节
- 通过接口的子类来指定创建哪一个对象
来看一下工厂方法模式在实际应用中的使用。如在常见的日志模块中。现在Java Web应用使用的日志都是基于slf4j 。看在这里面的实现:
private final static Logger LOGGER = LoggerFactory.getLogger(UserServiceImpl.class);
对应的实现如下:
public static Logger getLogger(Class<?> clazz) {
Logger logger = getLogger(clazz.getName());
...
return logger;
}
public static Logger getLogger(String name) {
//获取ILoggerFactory的实现类的实例
ILoggerFactory iLoggerFactory = getILoggerFactory();
//用IloggerFactory实现类的实例去构造一个Logger实例,不用关心构造实现细节
return iLoggerFactory.getLogger(name);
}
这就是典型的工厂方法,只要项目中使用的基于slf4j的日志实现,我们就可以通过这一行代码来获取对应的日志实例。不管你使用的log4j , logback,log4j2等等。这一行代码就可以获取对应的日志的实现。
在spring源码中,FactoryBean#getObject()就是经典的工厂方法的应用。