관리 메뉴

HAMA 블로그

Factory Method 에 대한 고찰 본문

디자인패턴

Factory Method 에 대한 고찰

[하마] 이승현 (wowlsh93@gmail.com) 2015. 8. 17. 14:54

제목이 "고찰" 이라니 먼가 있어보이긴한데.. 사실 별거 없습니다. ^^

어떤 개발자싸이트에 올라온 질문에 대한 저의 답변을 블로그에 정리해봅니다.


질문:


헤드퍼스트 책 보고 공부하다보니깐, 심플 팩토리보다 팩토리 메서드 패턴이 더 좋다는것같은데,

심플팩토리도 충분히 괜찮은것같은데 어떤점이 더 좋은건가요..? 책을 또 읽어봐도 이해가 잘 안되서...

답변 부탁드립니다~!


답변:


심플팩토리는 그냥 하나의 부모로부터 상속받은 객체중 하나를 클라이언트에게 던저주는것.

팩토리 메소드는 자신이 구현상속을 해야 하며,오버라이딩을 통해 객체 생성하는것!  입니다.


두개의 공통점은 어떤 객체를 생성해서 사용할지를 런타임시까지 미룬다는것이며

중요한 차이점은 팩토리가 상속받은거냐, 아니냐일 뿐입니다.

따라서  객체생성의 종류의 수 와는 무관합니다.

차라리 객체생성군으로 넘어가려면 abstract  factory  와 비교해야 맞는거 같습니다.


결국 둘중하나의 선택의 기로에서는 팩토리 자신의 부모가 있냐 없냐에 따른 장단점에 집중하면 폭을 좁힐수 있을거 같습니다

  

개인적으로 팩토리 메소드 패턴은 GOF 의 모든 패턴중 가장 이상하다고 보며 (  이름도 이상하고 부모레벨에 로직이 들어 간다는것도 별로고 , 유지보수등) , 대부분 심플 팩토리나 abstract  factory  로 대체 해야 한다고 볼 정도입니다. 이건 정말 고정적일꺼야 하는 최후의 코드정도 쓸까?



재질문:


일단 하마님이 하신 말씀중에 ,

심플팩토리는 그냥 하나의 부모로부터 상속받은 객체중 하나를 클라이언트에게 던저주는것.

이게 무슨말인지 이해가 잘 안가네요..ㅠ



재답변:


 "심플팩토리는 그냥 하나의 부모로부터 상속받은 객체중 하나를 클라이언트에게 던저주는것"

아래소스보시면  하나의 부모란 interfaceA 이고

상속받은 객체란 AProduct / BProduct 가 되는것이며, 

팩토리에서는 클라이언트한테 위의 두객체중 하나를 던저주고있습니다.  이해되실런지요?

 (http://corey.quickshiftconsulting.com/blog/first-post  <- UML 참조) 

class SimpleFactory{


     interfaceA create_A(String type){

          if(type == A){

               return new AProduct();   

           }
           else{

               return new BProduct();              
           }

     }

}


interfaceA{}

class AProduct implements interfaceA{}
class BProduct implements interfaceA{}


그 책은 먼가 팩토리메소드 패턴에 대해서 굉장히 긍정적으로 바라보고 있나 보군요 :-) 

부모레벨에 코드가 고착화 되있는데, 유연성이 좋아진다라..-.-a  편의성/합치성이 좋아진다거나 

abstract factory 라면 모를까..흠흠 퇴근길에 참고해 보도록 하겠습니다.


어쨋던 가장 중요한부분은 팩토리 자신이 부모로부터 상속받았느냐? 라는것입니다.

부모에 이미 구현된 코드들이 있으면, 하위 클래스들은 어떤부분에서  편하겠지요? 

그리고 어떤 순서등에 대한 약속이 부모에게 단단히 고정되어있다면 얻는 장점이 있겠지요? 

그런게 팩토리메소드의 장점 중 하나입니다.

결국 심플팩토리에 비한 장점이란 ~  "객체지향에서 상속의 장점은 무엇이냐"  와 마찬가지인겁니다.

마찬가지로 단점이란~~ " 객체지향에서 상속의 단점은 무엇이냐?"  와 같아지는겁니다.

Comments