지난 1화에서 우리는 Factory method를 배웠다. 오늘은 이어서 Creation method 중 Abstract factory method를 배워보자[1].

Abstract factory method를 한마디로 표현하면 Factory method를 여러개를 합친것을 말한다.


이전 화에서 주저리주저리 앞부분이 많았더니 틀린내용도 들어가고 내가 뭐썻는지 자꾸 까먹음.

오늘은 바로 팩토리오에 대입해서 시작해보도록 하자.


먼저 factory method를 보자 우리는 factory method를 사용하여 철판, 톱니바퀴, 전자회로를 이용하여 다이소를 구성하였다.

각 아이템에 하나의 용광로가 아닌 전체 용광로 하나와 다이소 여러개를 지었었다.


[그림 1. 기본 다이소]


[그림 1]은 우리가 기본 다이소를 factory method를 이용하여 용광로를 한쪽에 몰아서 짓고 다이소를 한쪽에 쭉 나열하여 철판, 전자회로, 톱니바퀴를 기반으로한 factory method를 만들었다. 자 여기서 Abstract factory method를 적용 할 곳은 바로 투입기다.


기본 투입기의 종류는 총 7가지가 있고 화력 투입기를 제외하고 총 6개이다. 

그중 가장 많이 쓰는 투입기인 노랑, 빨강, 파랑을 Abstract Factory Pattern을 적용 시켜 보자.


Abstract Factory Pattern


1.1 풀려고 하는 문제

디자인 패턴을 배우는 이유는 문제를 해결함에 있어서 가장 효율적인 방법을 이용하여 풀려고 하는 것이다. 

앞으로 나오는 모든 패턴에는 어떤문제를 풀것인지를 먼저 정의한다. 

팩토리오에서 Abstract Factory Pattern은 하나의 완성품으로 다른 완성품들을 만들 때 사용 가능하다.


자 먼저 문제를 보자.


[그림 2. Inserter factory problem]


[그림 2]를 보자 정말 정겹지 않은가? 솔직히 스샷 찍으면서 침 흘렸다. 우리는 여기서 두 가지를 해야한다. 먼저, 용광로를 factory method를 이용하여 떼어낸다. 다음으로 Abstract Factory method를 이용하여 빨간 투입기와 파랑 투입기를 만들어보자.


1.2 Interface

사실 팩토리오에서 Interface를 어떻게 표현해야할지 고민이 많았다. 아이디어가 떠오르질 않았다. Dependency Injection (DI)에 대해서 설명을 하고 싶은데 이걸 설명을 할때는 Inversion Of Control (IoC)의 개념을 같이 알려줘야한다. 이걸 팩토리오로 어떻게 하면 설명 할 수 있을까 고민 했다. 사실 Interface 만 해도 Interface-based Programming 이라는 분야가 따로 있다 [2, 3, 4] (컴공이라면 3번 재밌음 읽어보셈). Interface를 조금 자세하게 설명할 필요가 있다고 느끼지만 어디까지나 모두가 쉽게 배워야 한다고 생각하기 때문에 간단하게 설명하겠다.


앞에 장황하게 뭘 이상한말을 써댔는데 결국에는 [그림 1]의 톱니 바퀴, 전자회로, 철판 이 세개가 다이소의 Interface가 되는 것이다. 즉, 공통된 것을 따로 빼낸다는 말이다. 그럼 여기서 Factory method하고 Interface가 뭐가 달라요? 라는 질문이 생기는데 Factory method는 직접적인 구현체가 존재하고 interface는 직접적인 구현체는 없다는 것이다. (마치 청사진 처럼)


이걸 팩토리오에(억지로) 대입하면 Factory method는 용광로에만 해당이 되고(철광석 가공이 가장 기본이 되기 때문) 톱니 바퀴는 공통된 완제품이 되는 것으로 Interface라고 말할만 하다.


1.3 Solution

자 [그림 2]를 다시 보자. [그림 2] 문제에서의 Interface는 무엇인가? 노랑 투입기, 톱니 바퀴, 철판, 전자회로가 Interface다. 이걸 이용하여 [그림 2]를 refactoring 해보자. 사실 이걸 이쁘게 고치면 [그림 1]에서 출발 하면 된다.


[그림 3. 최종 공장]


생각 보다 간단하다. [그림 1]에서 투입기하나만 뒤쪽으로 한줄을 내고 집을 수만 있게 한다면(투입기 Interface) 

빨강 투입기와 파랑 투입기를 간단하게 만들 수 있다.


사실상 오늘 Abstract Factory Pattern은 factory pattern과 아주 비슷하기 때문에 어렵지 않았을 것이다.

오늘도 숙제는 나간다.


Homework

다음 공장을 refactoring 하시오.



Homework 심화과정

크라스토리오2 + 우주탐사모드(krastorio 2 + Space Exploration Mod)에서 다이소를 [그림 1]과 비슷하게 건설 하시오.








Reference

[1] Refactoring guru, Design pattern, https://refactoring.guru/design-patterns/abstract-factory

[2] Steimann, Friedrich. "The Infer Type Refactoring and its Use for Interface-Based Programming." J. Object Technol. 6.2 (2007): 99-120.

[3] Helmick, Michael T. "Interface-based programming assignments and automatic grading of java programs." Proceedings of the 12th annual SIGCSE conference on Innovation and technology in computer science education. 2007.

[4] Steimann, Friedrich, and Philip Mayer. "Patterns of Interface-Based Programming." J. Object Technol. 4.5 (2005): 75-94.