工厂模式是设计模式中的“低门槛”,老少咸宜,屡试不爽。
工厂模式是在需要创建新对象实例时使用,一般是使用定义好的XxxFactory类调用createXxx()方法来创建实例,可以根据不同参数或方法名创建不同的实例,用来代替传统的new Xxx()。
各种开源框架的源代码中大量使用此模式创建实例。
如,著名的开源工作流框架Activiti,当需要创建流程模型校验器时,就要使用工厂模式获取
ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory();
ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator();
这时候可能有小伙伴问了:传统的创建对象的方法好像比工厂模式更简单直接,明明一行代码可以搞定的事情,为什么非要先创建个工厂对象,再获取需要的对象?
要解决这个疑问,我们不妨从上面的例子源码中一探究竟。查看createDefaultProcessValidator()方法的具体实现
public ProcessValidator createDefaultProcessValidator() {
ProcessValidatorImpl processValidator = new ProcessValidatorImpl();
processValidator.addValidatorSet(new ValidatorSetFactory().createActivitiExecutableProcessValidatorSet());
return processValidator;
}
我们发现,工厂类首先按照传统方法new了一个对象,然后给这个对象设置了一个属性值validatorSet;巧的是,指定属性值时也使用了工厂模式获取属性对象,那不妨再看看createActivitiExecutableProcessValidatorSet()的具体实现
public ValidatorSet createActivitiExecutableProcessValidatorSet() {
ValidatorSet validatorSet = new ValidatorSet(ValidatorSetNames.ACTIVITI_EXECUTABLE_PROCESS);
validatorSet.addValidator(new AssociationValidator());
validatorSet.addValidator(new SignalValidator());
validatorSet.addValidator(new OperationValidator());
validatorSet.addValidator(new ErrorValidator());
validatorSet.addValidator(new DataObjectValidator());
///
return validatorSet;
}
这一看就明白了吧,使用工厂模式和传统方式的根本场景区别在于:如果在new一个对象后,还要进行一系列对象初始化工作(比如给属性字段赋值等),那就需要重构为工厂模式,让需要创建该对象实例的开发人员不需要知道创建细节就可以拿到可正常使用的对象;如果仅仅只需要new一下,比如new StringBuilder(),那就可以不使用工厂模式了。
网友评论