개발/프로그래밍
패턴 - Factory
플랜B
2020. 3. 8. 21:08
여러 종류의 데이터를 처리할 때, 분류를 위해 if else 혹은 switch 구문을 사용하곤 했는데,
코드가 너무 산만해지고 깔끔한 느낌을 받지 못했다.
데이터 type별로 처리할 수 있는 Processor를 만들고
한 곳에서 Processor를 관리한다.
1. 필요한 인터페이스를 정의한다.
public interface Processor {
public String getTypeValue();
public boolean processing(JsonObject jsonObject);
}
2. 정의한 인터페이스를 구현하며, 각 데이터 type 별로 로직을 추가한다.
@Configuration
public class Type1Processor implements Processor {
@Value("Type1")
private String type;
@Override
public String getTypeValue() { return type; }
@Override
public boolean processing(JsonObject jsonObject) {
/*
Processing ...
*/
}
}
3. 팩토리 빈 만들기
@Configuration
public class ProcessorFactory implements FactoryBean<Processor>{
private String typeValue;
@Resource(name="ProcessorManager")
private Map<String, Processor> processorManager;
@Override
public Processor getObject() { return processorManager.get(this.typeValue); }
@Override
public Class<? extends Processor> getObjectType() {
return Processor.class;
}
public void setTypeValue(String typeValue){ this.typeValue = typeValue; }
}
4. 팩토리 빈에서 사용할 Processor를 Map으로 관리해서, 코드를 더 간결하게 한다.
- 3번의 @Resource(name="ProcessorManager") 가 @Bean(name="ProcessorManager")과 매핑된다.
- 데이터 종류가 추가될 때, Processor를 추가하면 된다.
@Configuration
public class ProcessorManager {
@Autowired
private Type1Processor type1Processor;
@Autowired
private Type2Processor type2Processor;
@Autowired
private Type3Processor type3Processor;
/*
Proccessor 추가..
*/
@Bean(name="ProcessorManager")
public Map<String, Processor> processorManager() {
Map<String, Processor> processorHashMap = new HashMap<>();
processorHashMap.put(type1Processor.getTypeValue(), type1Processor);
processorHashMap.put(type2Processor.getTypeValue(), type2Processor);
processorHashMap.put(type3Processor.getTypeValue(), type3Processor);
/*
HashMap에 Proccessor 추가..
*/
return processorHashMap;
}
}
5. 팩토리 빈 사용하기
@Autowired
private ProcessorFactory processorFactory;
public boolean processing(String type, JsonObject jsonObject) {
processorFactory.setTypeValue(type);
return processorFactory.getObject().processing(jsonObject);
}
반응형