Design Pattern) 단순 팩토리 - Simple Factory

2021. 2. 5. 00:37Data structure (자료구조)

목차)

 

- 단순 팩토리이란

 

- 단순 팩토리 사용법

 

- 단순 팩토리 사용이유

 

- 활용 예시

 

- 느낀점

 

 

 

 

- 단순 팩토리이란?

클래스 내부에서 객체를 인스턴스화를 하게 되면 그 객체는 생성한 클래스랑 결합관계가 됩니다.

그 결합관계는 나중에 코드 수정이나 확장할 경우 비용이 많이 들게 되겠죠.

이런 문제를 해결하고자 객체 생성만 하는 클래스를 따로 만들어 제공하면 추후에 수정이나 확장할 때 용이하게 만들어줍니다.

 

이렇게 특정 객체를 생성한 후 반환해주는 클래스를 가르켜 팩토리라고 합니다.

이중에서 객체를 리턴해주는 메소드와 객체의 개수가 일치하는 클래스를 단순 팩토리라고 부릅니다.

 

- 단순 팩토리 사용법

기본적으로 객체를 생성하는 팩토리 클래스가 있으며 다른 객체를 생성해 반환해주는 메소드가 존재합니다.

보통 팩토리 클래스는 static 형식으로 선언해 언제든지 접근해서 사용하게 만드는게 좋습니다.

 

 

 

- 단순 팩토리 사용 이유

1. 코드 최적화

같은 객체를 각각 다른 클래스에서 생성하게 되면 같은 내용을 반복적으로 제작하게 되고 결국엔 코드 길이가 늘어나게 됩니다. 하나의 클래스에서 반환된 객체를 사용할 경우 조금 더 코드가 줄어드게 되고 보는 면에서도 이해하기 쉬워집니다.

 

2. 이해

A클래스를 상속하는 B가 있다고 하면 어떤 클래스는 A객체를 사용하고 어떤 클래스는 B객체를 생성해 사용한다고 치죠.

그러면 나중에 리팩토링을 하게 되면 이 객체는 어떤 클래스를 상속한 객체고 이 객체는 어떤 클래스를 상속했고...

이런식으로 찾아보면서 리팩토링을 하게되죠. 이런 부분을 비용이 많이 듭니다.

만약 한 클래스에서 객체 생성을 담당한다고 칩시다.

그러면 리팩토링을 하게 될때 그 객체 생성을 담당한 클래스 쪽만 찾아보면 됩니다.

 

 

- 활용 예시

탄막슈팅 게임을 만들려고 합니다. 적이 쏘는 총알이 있을꺼고 플레이어가 쏘는 총알도 있을꺼고, 펫이 쏘는 총알도 있을겁니다.

 

 

class UML로 표현을 하자면 이런느낌이죠

 

 

여기 총알을 생성하는 부분을 담당하는 BulletFactory 라는 클래스가 있습니다.

 

 

 

 

 

그럼 각각 Player, Enemy, Pet 클래스에서 BulletFactory를 통해 Bullet객체를 받아와 사용하면 됩니다.

이렇게 간단하게 완성이 되었습니다. 하지만 보완한 점이 몇개 보이네요.

 

일단 탄막슈팅게임 같은 경우는 애초에 총알 객체가 많이 나오는 게임이니 오브젝트 폴링을 사용하면 좋을거 같다고 생각이 들었습니다.

그러면 BulletFactory 클래스에서 생성한 총알 객체를 저장하고, 다른 클래스에서 생성을 원하면 비활성화된 총알 객체를 반환해주는 식으로 만들면 좋을것 같습니다.

 

일단 Bullet 클래스에서 활성화인지 비활성화인지 체크할 변수 하나 만들었습니다.

 

 

그후 BulletFactory 클래스에서 생성했던 객체를 저장하는 변수를 만들고, 생성할 때 비활성화 된 총알 객체만 반환해주도록 만들었습니다.

만약 저장한 변수안에 비활성화 된 객체가 없으면 총알 객체를 새로 생성해주고 그 객체를 반환해주는 식으로 만들었습니다.

 

 

- 느낀점

솔직하게 단순 팩토리를 쓰면서 코드가 많이 줄어든 느낌이 들었습니다.

위에 탄막슈팅 게임에서 단순 팩토리 패턴을 쓰지 않았을 경우 각 Unit 클래스에서 자기가 생성한 객체를 저장하는 변수를 만들어야 합니다. 즉 추가 코드(메모리 늘어나는)가 생기죠.

 

이러한 효율성 떄문에 팩토리 패턴에서 기본인 단순팩토리를 쓰는거 같습니다.