工厂模式代码实例详解(二)

2022-12-14 18:31:02 浏览数 (2)

上篇文章说了:

工厂模式代码实例详解

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

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

下面直接代码实例详解。

代码语言:javascript复制
/**
 * @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动态获取需要做的业务,从而实现工厂解耦,当我们后面需要新增业务,只需要新增实现类就好。

代码语言:javascript复制

/**
 * @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();
    }

0 人点赞