팩토리 메소드 패턴
팩토리 메소드 패턴이란?
객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스가 내리도록 하는 패턴
즉, 객체를 만들어 내는 공장(Factory 객체)을 만드는 패턴이다.
위 설명을 좀 더 쉽게 설명하자면,
예를 들어 카드를 생성한다고 했을 때 단순히 카드를 생성하겠다는 것은 기반 클래스에서 정의를 하고, 구체적으로 어떤 카드를 생성할 지는 서브 클래스가 결정하는 것이다.
팩토리 메소드의 구조
- Creator의 서브 클래스에 팩토리 메소드를 정의하여, 팩토리 메소드 호출로 적절한 ConcreteProduct 인스턴스를 반환한다.
팩토리 메소드 패턴의 예시 (Java 코드)
- Product 인터페이스
abstract class Product {
public abstract void use();
}
class IDCard extends Product {
private String owner;
public IDCard(String owner) {
System.out.println(owner + " 카드 생성");
this.owner = owner;
}
@Override
public void use() {
System.out.println(owner + " 카드 사용");
}
public String getOwner() {
return owner;
}
}
- 객체를 만드는 Factory
abstract class Factory {
public final Product create(String owner) {
Product p = createProduct(owner);
registerProduct(p);
return p;
}
protected abstract Product createProduct(String owner);
protected abstract void registerProduct(Product p);
}
class IDCardFactory extends Factory {
private List<String> owners = new ArrayList<>();
@Override
protected Product createProduct(String owner) {
return new IDCard(owner);
}
@Override
protected void registerProduct(Product p) {
owners.add(((IDCard) p).getOwner());
}
public List<String> getOwners() {
return owners;
}
}
- 사용
Factory factory = new IDCardFactory();
Product card1 = factory.create("홍길동");
Product card2 = factory.create("이순신");
Product card3 = factory.create("강감찬");
card1.use();
card2.use();
card3.use();
- 실행 결과
홍길동의 카드를 만듭니다.
이순신의 카드를 만듭니다.
강감찬의 카드를 만듭니다.
홍길동의 카드를 사용합니다.
이순신의 카드를 사용합니다.
강감찬의 카드를 사용합니다.
팩토리 메소드를 사용하는 이유
팩토리 메소드 패턴을 사용하면 클래스 간의 결합도
를 낮출 수 있다. 결합도
는 클래스의 변경점이 발생하였을 때, 이 변경점이 다른 클래스들에 얼마나 많은 영향을 주느냐를 나타내는 정도를 말하는데 팩토리 메소드를 사용하게 되면 객채 생성을 서브클래스에 위임함으로써, 직접 객체를 생성해 사용하는 것을 방지할 수 있기 때문에 보다 효율적인 코드 제어가 가능하며 의존성을 제거할 수 있다.
그래서 결과적으로 결합도
를 낮출 수 있게 된다.
팩토리 메소드의 장단점
- 장점
- 생성자가 아닌 메소드로 작동하기 때문에 리턴값을 가지게 되므로 상황에 따라 서로 다른 객체를 반환할 수 있다
- 객체들을 한 곳에서 관리할 수 있다
- 코드의 중복을 줄일 수 있다
- 유연하고 확장성 있는 구조를 가진다.
- 이름을 가질 수 있다. ( 목적을 확실히 나타낼 수 있다. )
- 단점
- 계속해서 새로운 하위클래스를 정의한다는 점 때문에
불필요하게 많은 클래스를 정의
할 경우가 생긴다. 이로 인해, 복잡해 질 수 있다는 단점이 존재한다.
- 계속해서 새로운 하위클래스를 정의한다는 점 때문에
면접에 나올 수 있는 질문
- 팩토리 메소드가 무엇인지에 대해 말해보세요
- 팩토리 메소드와 생성자의 차이점을 말해보세요
- 결합도가 낮아지면 좋은이유에 대해 말해보세요
- 다음과 같은 객체가 주어졌을 때 팩토리 메소드를 작성해보세요 ( 위의 Card와 Product가 주어졌다고 가정 )
참고자료
- John Grib님 블로그 - 팩토리 메소드 패턴(Factory Method Pattern)
- JDM님 블로그 - 팩토리 메소드 패턴(Factory Method Pattern)
- 꿩이야기님 블로그 - 팩토리 메소드 패턴 중 장단점
기여자
HongEunho
📦