본문 바로가기

프로그래밍

내 입맛대로 간단하게 정리한 디자인 패턴 - 팩토리 패턴(Factory Pattern)

참고
객체 = 인스턴스
class = public class로 만들어 진 class

 


팩토리 패턴은 크게 3가지가 있다.

팩토리 패턴의 가장 기본적인 정의만 알고 싶다면 1번만 알아도 충분하다.

하지만 실무에서는 2,3번을 많이 활용한다.

 

실무코드는 우리가 짜왔던 Main 위주의 코드가 아니다.

Main은 어디있는지 보이지도 않고, 인터페이스와 추상화로 점철되어 있기 때문에 보기가 힘들다.

코드의 규모가 커지다보니 관리의 효율을 위해서 부득이하게 여러 가지 디자인 패턴이 들어간 것이다.

 

실무소스를 볼 순 없지만 이런 디자인 패턴들의 정의나 개념만이라도 알고 가면 추후에 분명 도움이 될 것이다.

 

 

 

 

1. 심플 팩토리 패턴
Main이 아닌 다른 클래스에서 객체를 생성
이럴 경우 메소드에서 객체 생성하는 것과 다를 바 없음
class가 새로 생길 때 마다 객체 생성하는 부분을 수정해줘야 함

ex) Robot을 생성하는 클래스에서 type에 맞게 Robot을 생성한다.
새로운 Robot(ex:PetRobot) class가 생기면 그에 맞게 객체 생성 코드를 변경해야 함



2. 팩토리 메소드 패턴
심플 팩토리 패턴의 확장판
Main이 아닌 다른 클래스에서 객체를 생성하되, 이 클래스에서 직접 생성하지 않음
이 클래스를 인터페이스화하든 추상클래스화하든 여기선 직접 생성하지 않고, 이 것을 상속한 클래스에서 객체를 생성함
심플 팩토리 패턴은 새로운 class가 생기면 그에 따라서 객체 생성하는 부분을 바꿔야 한다. 
팩토리 메소드 패턴에서는 인터페이스화 혹은 추상화하였기 때문에 객체 생성 클래스를 상속해주기만 하면 된다.
즉 디자인 패턴의 기본 원칙처럼 수정을 하지 않으면서 구조는 확장될 수 있게 한 것이다. 

ex) Robot 생성하는 클래스를 추상화 혹은 인터페이스화 한다.
새로운 Robot class(ex:PetRobot)가 생기면, Robot 생성 클래스를 상속 혹은 구현한 새로운 class를 만든다.
그래서 이 새로운 class에서는 PetRobot을 생성하는 것이다.


3. 추상 팩토리 패턴
팩토리 메소드 패턴에서는 객체 생성 class가 여러 개가 만들어 진다.
이 class 들이 각각 해당하는 객체를 생성한다.

추상 팩토리 패턴에서는 하나의 class에서 여러 종류의 객체를 생성한다.

예를 들자면 팩토리 메소드에서는 RobotFactory 라는 인터페이스를 구현하는 PetRobotFactory, DronRobotFactory 등이 만들어 진다.
추상 팩토리 패턴은 이러한 여러 팩토리들을 하나의 class에서 관리한다는 것이다. 

comprehensiveFactory라는 class를 만들고 그 안에서  PetRobotFactory, DronRobotFactory에 대한 생성자를 만든다는 것이다.

팩토리 메소드 패턴과 마찬가지로 새로운 class가 생기면 그에 맞는 새로운 class들만 생성해주면 된다.
comprehensiveFactory는 심플 팩토리 패턴처럼 약간의 수정은 필요하다. 겉으로 보기엔 심플 팩토리와 별차이가 없어 보일 수 있다. 
다른 점은 추상 팩토리 패턴에서는 객체가 아닌 객체를 만드는 class를 새로 만든다는 것이다. 인터페이스 연결만 잘 되어 있다면 자동 완성 기능으로 빠르게 새로운 팩토리(=객체 생성하는 class)를 만들 수 있다.
ex)새로운 종류의 로봇이 나온다면 기존의 2개의 Factory만 고려하는 코드에서 경우의 수를 하나 추가하는 것이다. 
심플 팩토리에서는 객체 생성을 직접 하지만, 추상 팩토리 패턴은 객체 생성해주는 객체를 만들어주는 것이다.


정리하자면 아래와 같다고 볼 수 있다.
여기서 공장은 class를 의미한다.
팩토리 메소드 구현이나 추상 팩토리 구현에서는 공장은 인터페이스나 추상 클래스를 의미한다. 

1. 심플 팩토리 패턴
=> 하나의 공장(=class)에서 여러 개의 객체 생성  = 동네 가게

2. 팩토리 메소드 구현
=> 공장 여러 개 만들어서 각 공장에서 해당 속성에 맞는 객체 생성 = 프렌차이즈, 체인점

3. 추상 팩토리 패턴
=> 하나의 거대한 공장 안에 각 분야의 공장이 있고, 큰 공장이 작은 공장을 관리 = 대기업의 본점

 

디자인 패턴에 대해서 첨언하자면, 한 블로그의 작성자 댓글을 언급하고 싶다.

 

스트래티지 패턴과 팩토리 패턴의 차이점이라..
간단하게 보자면 스트래티지 패턴은 자주 변할 수 있는것들을 캡슐화하고 캡슐화된 요소들을 각각 바꿔가며 사용하면 더 유연하게 사용 할 수 있다는 것에 대한 디자인을 제시해주는 것이고,

팩토리 패턴은 팩토리라는 이름 처럼 실제로 인스턴스를 생성하는 일을 할 것인데 어떻게 하면 좀더 유연하고 관련성 있게 인스턴스를 만들어낼 수 있을까 하는 방법들의 디자인을 제시해 주는것이라 볼 수 있을것 같습니다.

디자인 패턴은 다방면에 응용 적용되고 실제로 여러 패턴이 함께 사용되는 경우가 더 많아서 정확히 이건 이거다 저건 저거다 이렇게 정의 하시는것 보다는 "이런 방법의 디자인 구조?" 이렇게 접근하시는게 좀더 이해에 도움이 되시지 않을까 생각됩니다.

 


참조 

심플한 설명
https://cjw-awdsd.tistory.com/54

좀 더 자세한 설명
오타가 약간 있고 설명이 많이 길지만 좀 더 자세한 예시를 들고 있다.
https://jusungpark.tistory.com/14#comment11745443