본문 바로가기

Develop/DESIGN PATTERNS

[GoF Design Pattern] 추상 팩토리 패턴 (Abstract factory pattern)

1. 추상 팩토리 패턴이란?

관련 있는 인스턴스를 만들어주는 팩토리를 추상화된 형태로 정의하는 패턴이다. (인터페이스나 추상클래스)

따라서 다양한 구성 요소 별로 '객체의 집합'을 생성해야 할 때 유용하게 활용할 수 있다.

2. 구현 방법

다음과 같은 구조로 설계할 수 있다.

public class WhiteshipFactory extends DefaultShipFactory {

    private ShipPartsFactory shipPartsFactory;

    public WhiteshipFactory(ShipPartsFactory shipPartsFactory) {
        this.shipPartsFactory = shipPartsFactory;
    }

    @Override
    public Ship createShip() {
        Ship ship = new Whiteship();
        ship.setAnchor(shipPartsFactory.createAnchor());
        ship.setWheel(shipPartsFactory.createWheel());
        return ship;
    }
}

WhiteshipFactory 클래스는 위와 같다.

이때 만약 배의 부품을 만드는 팩토리를 변경하고 싶다면, 별도의 WhitePartsProFactory 클래스를 구현하여 파라미터로 넘기면 된다.

 

public class ShipInventory {

    public static void main(String[] args) {
        ShipFactory shipFactory = new WhiteshipFactory(new WhitePartsProFactory());
        Ship ship = shipFactory.createShip();
        System.out.println(ship.getAnchor().getClass());
        System.out.println(ship.getWheel().getClass());
    }
}

 

 

이렇게 클라이언트 코드를 작성할 수 있다.

보시다시피 WhiteshipFactory의 생성자를 호출하며 WhitePartsProFactory 인스턴스를 파라미터로 넘겨주었다.

따라서 WhiteshipFactory는 WhitePartsProFactory 인스턴스를 통해 createShip() 메서드를 실행한다.

3. 팩토리 메서드 패턴과의 차이점은?

인스턴스를 생성하는 책임이 팩토리에 있다는 점은 팩토리 메서드 패턴과 굉장히 유사하다.

하지만 전체적인 초점이 팩토리를 사용하는 클라이언트에 맞춰진 디자인 패턴이란 게 차이점이다.

 

쉽게 말해, 클라이언트 쪽에서 팩토리를 사용하는 코드를 인터페이스 기반으로 만들기 위해 사용하는 패턴이라고 할 수 있다.

두 패턴 모두 객체를 만드는 과정을 추상화 시켰다. 하지만 보는 관점이 조금 다를 걸뿐!

 

추상 팩토리 패턴은, 팩토리를 통해서 클라이언트가 추상화된 인터페이스나 클래스를 사용할 수 있기 때문에 클라이언트가 직접 콘크리트 클래스를 참조해서 사용할 필요가 없어진다.