[디자인패턴] 팩토리 메서드
🤔 팩토리 메서드라니?
디자인 패턴 중 하나인 팩토리 메서드. 그런데 메서드라는 단어가 눈에 띈다. 자바나 C#에서 구현하는 그 method와 같으면서 다른 의미를 가지고 있다. (그렇다고 해서 자바와 C#에서만 쓰는 것이 아니다. 객체지향 설계를 하는 모든 설계에서 구현할 수 있다.)
Factory Method라고 하면 단순히 자바나 C#에서 객체를 생성하는 method (즉, 생성자)와 착각하기 쉬운데, 그것과는 다른 의미를 가지고 있다. (물론 method라는 단어의 절대적인 의미는 같다..) 생성자는 단순히 현재 클래스에 해당하는 객체를 생성하는 특수 메서드이지만, 팩토리 메서드는 어떠한 객체를 생성함에 있어서 확장의 가능성을 열어둔 패턴이라고 생각하면 된다. 궁극적으로 객체를 생성한다는 점에서는 동일하지만, 구현 방식과 활용 방법이 아예 다르다.
팩토리 메서드는 객체를 생성하기 위해 별도의 인터페이스를 정의한다. 그리고 실제로 어떤 객체가 생성될지는 서브 클래스에 맡기는 패턴이다. 즉, 서브 클래스에서 팩토리 메서드를 오버라이딩해서 객체를 반환하는 패턴이다.
🙄 왜 쓰는 거야..?
어떤 객체가 생성될지 예측하지 못할 때, 생성할 객체에 대한 책임을 서브클래스에게 위임할 때 주로 사용한다. 이는 객체지향의 5원칙인 SOLID 중 SRP와 OCP 원칙에 부합하는 내용이기도 하다. (객체지향 5원칙은 검색 고고! 다음에 자세히 다루겠다..) 하지만 단점도 존재하는데, Factory Method가 중첩되기 시작하면 굉장히 복잡하다고 한다. 또한, 슈퍼 클래스가 전혀 확장되지 않아서 extends를 잘못 사용한 예시라던데.. 단점에 대한 자세한 내용은 검색을 해보기 바란다..!
💻 팩토리 메서드 패턴 예시
package FactoryMethod;
// 원래는 interface를 통해 추상 클래스 구현에 대한 추상화를 먼저 진행해야 한다.
public abstract class Factory { // 객체 생성에 관한 추상 클래스를 정의한다.
public Object createObject(Long idx, String name) { // 객체 생성 메서드 여기서 Object는 실제 객체를 의미하는 것이 아니라,
Object object = create(idx, name); // 생성할 객체를 포괄하는 큰 객체를 의미한다. ex) Laptop -> (Mac book, Galaxy book, LG gram 등등..)
return object;
}
public abstract Object create(Long idx, String name); // 서브클래스에서 구현할 메서드의 추상화
// 서브클래스에서 create 메서드를 통해서 객체 생성을 정의하면, Factory 추상 클래스를 통해 객체를 생성한다.
}