工廠模式是設(shè)計模式中的“低門檻”,老少咸宜,屢試不爽。
工廠模式是在需要創(chuàng)建新對象實例時使用,一般是使用定義好的XxxFactory類調(diào)用createXxx()方法來創(chuàng)建實例,可以根據(jù)不同參數(shù)或方法名創(chuàng)建不同的實例,用來代替?zhèn)鹘y(tǒng)的new Xxx()。
各種開源框架的源代碼中大量使用此模式創(chuàng)建實例。
如,著名的開源工作流框架Activiti,當(dāng)需要創(chuàng)建流程模型校驗器時,就要使用工廠模式獲取
ProcessValidatorFactory processValidatorFactory = new ProcessValidatorFactory();
ProcessValidator defaultProcessValidator = processValidatorFactory.createDefaultProcessValidator();
這時候可能有小伙伴問了:傳統(tǒng)的創(chuàng)建對象的方法好像比工廠模式更簡單直接,明明一行代碼可以搞定的事情,為什么非要先創(chuàng)建個工廠對象,再獲取需要的對象?
要解決這個疑問,我們不妨從上面的例子源碼中一探究竟。查看createDefaultProcessValidator()方法的具體實現(xiàn)
public ProcessValidator createDefaultProcessValidator() {
? ? ?ProcessValidatorImpl processValidator = new ProcessValidatorImpl();
? ? ?processValidator.addValidatorSet(new ValidatorSetFactory().createActivitiExecutableProcessValidatorSet());
? ? ?return processValidator;
}
我們發(fā)現(xiàn),工廠類首先按照傳統(tǒng)方法new了一個對象,然后給這個對象設(shè)置了一個屬性值validatorSet;巧的是,指定屬性值時也使用了工廠模式獲取屬性對象,那不妨再看看createActivitiExecutableProcessValidatorSet()的具體實現(xiàn)
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;
}
這一看就明白了吧,使用工廠模式和傳統(tǒng)方式的根本場景區(qū)別在于:如果在new一個對象后,還要進行一系列對象初始化工作(比如給屬性字段賦值等),那就需要重構(gòu)為工廠模式,讓需要創(chuàng)建該對象實例的開發(fā)人員不需要知道創(chuàng)建細節(jié)就可以拿到可正常使用的對象;如果僅僅只需要new一下,比如new StringBuilder(),那就可以不使用工廠模式了。