工厂模式
作用
唯一的职责就是创建对象,将复制的创建过程,获取对象的逻辑与对象的使用进行解耦。
分为简单工厂、工厂方法、抽象工厂。
简单工厂
对象获取逻辑复杂时,例如根据文件类型获取对应的解析器,解析器有很多,就需要在使用对象前,进行臃肿的逻辑判断,才能获取对应的解析器对象。造成获取对象与使用对象耦合,不好扩展。后续新增解析器,又得在获取对象那里添砖加瓦了,不符合开闭原则。
将复杂的、需要扩展的对象创建和对象获取抽取出来,就是简单工厂了。
ParserFactory 简单工厂类
代码语言:javascript复制public class ParserFactory {
// 如果是单例,可使用依赖注入优化
private static Map<String, Supplier<Parser>> instances= Maps.newHashMap();
static {
instances.put(ParserConstant.JSON, JsonParser::new);
instances.put(ParserConstant.XML,XmlParser::new);
instances.put(ParserConstant.YMAL, YmalParser::new);
}
public static Parser newInstance(String format) {
return instances.get(format)
.get();
}
}
工厂方法
如果创建对象过程复杂,多个对象创建逻辑都放到简单工厂里,在类这个抽象层面来看,是不符合单一职责原则的。于是将各个对象创建过程封装到单独的工厂类里,然后创建工厂的工厂,用于封装获取工厂类的逻辑。这点类似于简单工厂类,只是获取的是工厂对象而非目标对象罢了。
抽象工厂
抽象工厂是对工厂方法里的工厂进行扩展,每个工厂能产生不同类型的对象(不常见)
扩展
在JDK中工厂方法的命名有些规范
- valueOf() 返回与入参相等的对象 例如 Integer.valueOf()
- getInstance() 返回单例对象 例如 Calendar.getInstance() 特殊情况:Calendar.getInstance()返回的不是单例
- newInstance() 每次调用时返回新的对象 例如 HelloWorld.class.getConstructor().newInstance()