首页 > 代码库 > Java工厂模式应用
Java工厂模式应用
之前在项目中遇到这样一种情景:代码中有一个共用的任务处理模块,不同的数据会通过唯一键(任务名称和key fields)全部存入公共任务表里,然后在同步模块通过任务名称去获取相应的任务进行同步处理。
在存入公共任务表之前,不同的任务线都会进行各自的逻辑处理,而且基本上不存在共用的代码,所以在这里考虑建一个工厂类,由Spring注入一个Map<String, interface>,String对应的各个任务的名称,interface对应的是每个任务的处理接口。e.g.
<bean id="linkingDetectService" class="cn.vobile.service.linkingdetect.LinkingDetectServiceImpl"> <property name="taskPriority" ref="normal" /> <property name="commonTaskService" ref="commonTaskService" /> <property name="gson" ref="gson" /> </bean> <bean id="reclaimMatchSubscriptionService" class="cn.vobile.service.matchsubscription.reclaim.ReclaimMatchSubscriptionServiceImpl"> <property name="taskPriority" ref="normal" /> <property name="matchSubscriptionService" ref="matchSubscriptionService"/> <property name="gson" ref="gson" /> <property name="matchedVideoService" ref="matchedVideoCommonService" /> <property name="transactionTemplate" ref="masterTransactionTemplate" /> </bean> <bean id="commonTaskFactory" class="cn.vobile.service.commontask.CommonTaskFactory"> <property name="serviceMap"> <map> <entry key="linkingDetect"><ref bean="linkingDetectService"/></entry> <entry key="reclaimMatchSubscription"><ref bean="reclaimMatchSubscriptionService"/></entry> </map> </property> </bean>
工厂类CommonTaskFactory的代码如下:
public class CommonTaskFactory { private Map<String, AbstractCommonService> serviceMap; /** * Create a task service by taskName. * * @param serviceName * @return */ public AbstractCommonService create(String taskKey){ return serviceMap.get(taskKey); } /** * * @param serviceMap */ public void setServiceMap(Map<String, AbstractCommonService> serviceMap) { this.serviceMap = serviceMap; } }
接口AbstractCommonService定义如下:
public interface AbstractCommonService { /** * save a task to workingCommonTask * * @param matchedVideo * @param taskName * @param matchType * @param priority */ void addWorkingTask(MatchedVideo matchedVideo, CommonTaskName taskName, MatchType matchType); }
工厂类方法调用代码示例如下:
AbstractCommonService linkingService = commonTaskFactory.create(CommonTaskKey.LINKINGDETECT.getCode()); linkingService.addWorkingTask(matchedVideo, CommonTaskName.SYNC_ADD_VIDEO_TO_TAISAN, null);
注:另外还有一种场景,各种任务存入公共任务表之前也许会存在很多的冗余代码(有很多的代码逻辑都是基本相同的),那么此时可以写一个抽象类(实现接口AbstractCommonService),把共用的代码写在该类中(每个任务线之间不同的部分可以使用抽象方法实现),然后各自不同的部分在各自的service类(继承抽象类)中实现父类中的抽象方法。
Java工厂模式应用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。