개발/프로그래밍

패턴 - 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);
        }
반응형