본문 바로가기

Develop/DESIGN PATTERNS

[GoF Design Pattern] 팩토리 메서드 패턴 (Factory method pattern)

1. 팩토리 메서드 패턴이란?

객체 생성 책임을 구체적인 클래스가 아니라 추상적인 인터페이스의 메서드로 감싸는 패턴이다.

만약 책임이 하나의 클래스에 몰려있다면 if문이 잔뜩 작성되어 있는 지저분한 코드가 된다. 또한 변경에도 닫혀있지 않다.

따라서 이러한 구체적으로 어떤 인스턴스를 만들지는 서브 클래스가 결정하되, 객체 생성 자체는 인터페이스의 메서드가 책임진다.

 

이때 구현체(ConcreteProduct)는 다양할 수 있으며, 그에 맞는 다양한 팩토리(ConcreteCreator)를 제공할 수 있다.

2. 구현 방법

위와 같은 구조를 가져갈 수 있다.

public class Client {

    public static void main(String[] args) {
        Client client = new Client();
        client.print(new WhiteshipFactory(), "whiteship", "keesun@mail.com");
        client.print(new BlackshipFactory(), "blackship", "keesun@mail.com");
    }

    private void print(ShipFactory shipFactory, String name, String email) {
        System.out.println(shipFactory.orderShip(name, email));
    }
}

이때 클라이언트는 특정 팩토리 객체만 넘겨줌으로써 원하는 인스턴스를 생성할 수 있다.

WhiteshipFactory와 BlackshipFactory는 모두 ShipFactory 인터페이스를 구현하기 때문에, ShipFactory 인터페이스의 메서드를 사용할 수 있다. shipFactory.orderShip()

 

이때 인터페이스의 일부 추상 메서드를 구현하는 추상 클래스(abstract class)를 중간에 둘 수도 있다.

public abstract class DefaultShipFactory implements ShipFactory {

    @Override
    public void sendEmailTo(String email, Ship ship) {
        System.out.println(ship.getName() + " 다 만들었습니다.");
    }
}

이제 DeafultShipFactory 클래스를 구현하게 되면 동일한 sendEmailTo() 메서드를 사용할 수도 있다. (이건 자유롭게 활용)

3. 장/단점

1) 장점

기존 코드를 건드리지 않고도 새로운 인스턴스를 생성하는 기능을 확장할 수 있다.

실제 객체를 생성하는 Creator와, 실제 객체인 Product 간의 결합을 느슨하게 가져가기 때문에 가능한 일이다!

2) 단점

각자 역할을 나누다보니까 클래스 수가 늘어난다는 단점이 있다.