CS

[CS] 디자인 패턴 - 팩토리

장아장 2023. 4. 21. 23:16

싱글톤 패턴에서는 모든 객체가 지연 초기화되거나, Holder로 즉시초기화 시켜 있는 객체를 불러와 사용하는 방식이다. 

 

소스 코드 : https://github.com/JangAJang/cs/tree/main/src/design/factory


팩토리 패턴이란?

팩토리 패턴은 말 그대로 '공장' 이다. 

공장에서 상품을 만들기 위해서 어떻게 할까?

  1. 발주를 받는다. 
  2. 발주 받은 주문서를 보고 이에 따라 상품을 만든다. 
  3. 상품을 준다. 

의 방식으로 동작하게 된다. 

 

이것과 비슷할까? 팩토리 패턴은 어떨까?

  1. Factory에 메서드(어쩌면 static 메서드)로 객체 생성을 요청한다. 
  2. 파라미터로 요청사항을 받는다. 
  3. 요청사항에 맞게 객체를 생성한다. 
  4. 객체를 반환한다. 

이런 식으로 처리하게 된다. 

여기에서 몇가지 주의해야 할 사항들을 생각해보자. 

  • 공장의 설비는 어느정도 비슷한 종류의 상품을 만든다. 
  • 즉, 상품들은 비슷한 종류다. 

라는 것이다. 


자바로 만들어보기

이를 자바적으로 풀어보면 어떻게 될까?

  • 객체들은 같은 상위 클래스를 가지게 된다. 

 

이를 위한 예시로 상품 생성 팩토리를 만들었다. 

  • 추상화 클래스 Item
    • 이를 상위 클래스로 가지는 Album
    • 이를 상위 클래스로 가지는 Book
    • 이를 상위 클래스로 가지는 Movie
    • 이를 상위 클래스로 가지는 DefaultItem
  • Item이라는 상위 클래스를 생성해주는 ItemFactory

를 가지게 만들었다. 

이렇게 모든 상품을 하나의 팩토리로 만드는 단순 팩토리 패턴을 구현했다. 

팩토리 패턴에서 개인적으로 아쉬운 부분이 있다면, 

  1. 모든 상품이 팩토리 하나로 만들어지면 너무 과대해지지 않을까?
  2. 그러면 새로운 상품이 만들어져야 한다면, Item을 상위 클래스로 가지는 객체와 이를 생성해주는 팩토리 로직을 또 만들어주어야 하지 않을까?

이 두 가지이다. 

 

일단 1번에 대해서는 해결할 방법이 생각 나기도 하고, abstract class가 아닌 interface로 만들면서 다시 생성해봐야겠다. 

이렇게 만들어진 구조가 있다. 

위에서 만들었을 때 처럼 객체들의 상위 구조를 만들어야 하는데, 이번엔 인터페이스로 만들어두었다. 

 

인터페이스를 이용해 추상화시킨 객체를 실제 객체에 추상클래스를 implements 시켜 구체화 시켰다. 

팩토리도 마찬가지로 해주었다. 

실제 객체들도 Book 타입으로 불러도 상위 클래스종류이기에 받아진다. 

이를 활용해, BookFactory에서도 반환타입을 Book으로 해두면, 모두 다 받을 수 있게 된다. 

interface로 모든 객체의 팩토리를 추상화시켜 만들고, 이를 implements해서 각 객체에 맞게 팩토리를 만들어줄 수 있다. 

이렇게하면, 모든 팩토리가 하나에 붙어있어, 그걸 찾아서 리펙토링하고(졘쟝...)할 필요가 없어진다. 

 

이게 너무 복잡해지면, 

  • MonthlyWrittenBookFactory : 월간물로 나오는 만화책, 잡지를 생성해주는 팩토리 클래스
  • DefaultWrittenBookFactory : 기본적인 책(문학, 비문학)을 만들어주는 팩토리 클래스

이런 방식으로 팩토리를 어느정도까지 나누어주어도 될 것 같다는 생각이 든다.


개인적인 느낌

너무 잘게 쪼개는 것도 이상할 것 같고, 너무 두루뭉술하게 만들어두는 것도 좋지 않을 것 같다. 

이를 통해 여러 연관있는 객체들을 한번에 정리해서 생성해줄 수 있게 해준다. 

또한, OCP원칙(수정에는 폐쇠적이며, 추가에는 개방적이어야 한다는 원칙)에 위배되지 않게 로직이 만들어진다. 

기존 코드를 수정해야 할 필요는 없어지며, 새로운 코드를 생성하기만 하면 된다는 장점이 있다. 

 

대신, 팩토리를 위해 상당히 많은 코드들이 추가되었다.

 

싱글톤을 공부할 때에는 ~~Constructor(staticName="~~")와 비슷하다는 느낌을 받았는데, 팩토리 패턴은 처음 보는 구조였다. 

조금씩 사용해보면서 익숙해져야 할 것 같다고 느껴진다. 

 

그럼....twenty thousand...🔥🔥🔥

'CS' 카테고리의 다른 글

[CS] 디자인 패턴 - 옵저버 ( 야 야 너 뭐하냐? )  (1) 2023.05.09
[CS] 디자인 패턴 - 전략 패턴  (0) 2023.04.30
[CS] 디자인 패턴 - 싱글톤  (0) 2023.04.21