팩토리 패턴

반응형
반응형

팩토리... 뜻은 공장... 그렇다는건 뭔가를 만든다는 거라고 할 수 있습니다. 

그러면 무엇을 만드는 걸까요? 간단히 말하면 객체를 만드는 행위라고 할수 있습니다.

근데, 자바에서는 new라는 키워드를 바탕으로 객체를 생성하고 있습니다. 그러면 그냥 new만 사용하면 되지 않을까요? 물론 그렇게 만들어도 크게 상관은 없지만... new만 사용하게 되면 객체들이 따로 놀게 됩니다. 왜냐하면 A라는 클래스를 생성하고 또 B라는 클래스를 생성한다고 가정하죠. 이 둘이 연관관계가 있다는 걸 알리기 위해서는 

A a;

이런식으로 인스턴스로 만들거나 이 인스턴스를 매개변수화 시키던가.

아니면 상속을 받아야 될겁니다. 만약, A와 B의 상하 관계가 없는 거라면 어떨까요? 상속은 사용할 수 없습니다. 그러면 우리가 선택할 수 있는 경우의 수는 인스턴스화 시키는 것이 최선일 겁니다. 

이게 왜 팩토리와 무슨 관련이 있을까요?

 

만약 new를 사용한다고 가정하고 코드를 작성해보겠습니다. 

Class A {
 B b = new B();
 b.xxx();
 b.yyy();
}

Class B {
  xxx();
  yyy();
}

이런식으로 작성되는데.... 이렇게 작성하게 되면 A클래스를 생성하게 되면 자동적으로 B클래스가 생성됩니다. 이러한 코드가 상관 없지만... A클래스를 만들때, B클래스가 필요하게 된다면 어떨까요?

이렇게 되면 개발자 입장에서 A클래스를 생성하려고 했는데 에러가 발생한다면...

왜 에러가 발생했는지 확인 할겁니다. 그리고는 B클래스를 외부에서 생성해서 주입을 시킵니다. 이를 전문용어로 DI (의존성 뒤집기) 라고 부릅니다. 여담으로 IOC라고도 한다고 합니다.(정확한건 아니지만...)

 

사실 아직 팩토리 패턴을 설명하지도 않았습니다. 

일반적인 공장을 생각해봅시다. 공장이라는게 저런 간단한 행위만 하지 않을 테고... (참고로 위처럼 만드는 걸 심플 팩토리라고 하며 관용적인 코드라고 합니다.) ..

 

해드퍼스트 디자인 패턴 169쪽을 읽어보면

 

더보기

모든 팩토리 패턴에서는 객체 생성을 캡슐화합니다. 팩토리 메소드 패턴에서는 서브클래스에서 어떤 클래스를 만들지를 결정하게 함으로써 객체 생성을 캡슐화합니다.

라고 나와 있습니다. 이는 객체 생성을 하위 클래스에서 결정하게 합니다. 즉. 하위 클래스에서 객체를 만든다고 생각하면 됩니다.

 

 

코드를 대충 짜보면...

abstract Class A {
  B create(String type);
}

Class C extends A {
    B create(String type) {
      if (type == "b") {
      	return new Bxxxx;
      }
    
    }
}

Class B {
  xxx();
  yyy();
}

대충 이런식으로 나옵니다. 예제 코드를 넣고 싶지만 요즘 귀찮이즘이 너무 심해져서 그냥 이렇게 할겁니다. (추후에 수정될지도 모르겠네요. 아니 수정해야져.)

 

여기에서 그치지 않고 새로운 객체를 생성하는 코드도 수정할 수 있습니다 위를 예로 들면 공장이 하나가 아니라 여러개로 만들 수도 있고... 여기에서는 A클래스가 되겠네요. 이걸 여러개로 만들어도 됩니다.

 

 

정리하자면, 팩토리 메소드 패턴은 객체 생성을 서브 클래스에서 생성하게 하는 패턴입니다. 간단히 만들면, 심플 팩토리라는 관용적인 표현으로 사용된다는 점 주의하시면 되겠습니다. 

아무튼... 객체를 만드는 패턴 중 하나입니다.

 

추적으로 static을 붙여서 만드는 팩토리 패턴을 정적 팩토리 패턴이라고 합니다.

 

 

이를 활용하면 팩토리 패턴 + 전략 패턴 등이 나올 수 있겠네요.

나머지는 조금 억지스러워서 패스 합니다.

 

다음 포스팅은 이것과 비슷한 추상 팩토리 패턴입니다.

 

반응형

'디자인패턴' 카테고리의 다른 글

프록시 패턴  (0) 2020.05.18
싱글톤 패턴  (0) 2020.05.12
데코레이터 패턴  (0) 2020.05.02
컴포지트 패턴  (0) 2020.05.01
옵저버 패턴  (0) 2020.04.28

댓글

Designed by JB FACTORY