上篇文章说了:

​​工厂模式代码实例详解

初学者写代码,可能只要实现功能就好,如果没有工厂模式,当新增功能的时候会出现大量的if esle判断,而且代码全都放在一个类,如同鸡蛋都放在一个篮子里面,并且与java面向编程思想相悖,我们应该把功能点解耦拆分,提供可复用性。

工厂模式有什么好处呢,符合开闭原则,当新增功能的时候,不需要修改以前的代码,只需要创建新的类实现以前的公有类,代码可维护性更高。

下面直接代码实例详解。

/**
* @author keying
*/
public interface FactoryService {

String getType();

void doCreate();
}


/**
* @author keying
*/
@Service
public class ArriveServiceImpl implements FactoryService {

@Override
public String getType() {
return "ARRIVE";
}

@Override
public void doCreate() {
System.out.println("ARRIVE DO CREATE");
}
}


/**
* @author keying
*/
@Service
public class SendServiceImpl implements FactoryService {

@Override
public String getType() {
return "SEND";
}

@Override
public void doCreate() {
System.out.println("SEND DO CREATE");
}


}




/**
* @author keying
*/
@RestController
public class FactoryController {

@Autowired
@Qualifier("arriveServiceImpl")
private FactoryService arriveServiceImpl;

@Autowired
@Qualifier("sendServiceImpl")
private FactoryService sendServiceImpl;

@Autowired
private FactoryEventEwb factoryEventEwb;

@RequestMapping("/factory")
public void factory(){
// FactoryService factoryService = FactoryEventEwb.getByType("ARRIVE");
// factoryService.doCreate();
sendServiceImpl.doCreate();
}

上面代码,我们现创建了接口,通过不同的类(功能)实现这个接口,当需要发件的时候,他的类型就是send,当需要到件的时候,他的类型就是arrive。do里面分别做自己需要的业务。

通过@Qualifier来指定需要注入的实现类,然后调用doCreate,会分别处理需要做的业务。

但是这样写,某些业务场景会有一些瑕疵,虽然实现了工厂模式,但是如果在这里调用的时候,需要判断当arrive的时候,还是需要send的时候。

于是可以对代码进行优化。

通过线程安全的map加构造函数,来通过getType动态获取需要做的业务,从而实现工厂解耦,当我们后面需要新增业务,只需要新增实现类就好。

/**
* @author keying
*/
@Component
public class FactoryEventEwb {

private static final Map<String, FactoryService> concurrentHashMap = new ConcurrentHashMap<>();

public FactoryEventEwb(List<FactoryService> list) {
for (FactoryService subHandler : list) {
if (StringUtils.isEmpty(subHandler.getType())) {
continue;
}
concurrentHashMap.put(subHandler.getType(), subHandler);
}
}

public static FactoryService getByType(String type) {
if (Objects.isNull(type)) {
return null;
}
return concurrentHashMap.get(type);
}

}

@RequestMapping("/factory")
public void factory(){
FactoryService factoryService = FactoryEventEwb.getByType("ARRIVE");
factoryService.doCreate();
// sendServiceImpl.doCreate();
}