Updated:

1. 개요

객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 객체를 생성할지에 대한 결정은 하위 클래스에서 하도록 하는 패턴

팩토리 메서드 패턴(Factory Method Pattern)은 생성 패턴(Creational Pattern)의 한 종류로, 객체를 생성해주는 팩토리 메서드를 정의하고, 객체 생성을 팩토리 메서드에 위임하는 패턴이다. 사용하는 쪽에서는 인터페이스에 의존하도록 하여 어떤 객체를 생성할지 컴파일 시점에 알 수 없도록 한다.

2. 생성 패턴(Creational Pattern)

2-1. 생성 패턴이란?

생성 패턴이란 인스턴스를 만드는 절차를 추상화하는 패턴으로, 객체를 생성, 합성하는 방법이나 객체의 표현 방법과 시스템을 분리해 준다. 생성 패턴은 아래 두 가지 특징으로 인해 무엇이, 어떻게, 언제 생성되는지 결정하는데 유연성을 확보할 수 있다.

  • 시스템이 어떤 구체 클래스를 사용하는지에 대한 정보를 캡슐화 한다.

  • 인스턴스들이 어떻게 만들고, 결합하는지에 대한 부분을 완전히 가려준다.

2-2. 생성 패턴 종류

3. 구성

[출처 : GoF의 디자인 패턴]

  • Product : 팩토리 메서드가 생성할 객체의 인터페이스 정의

  • ConcreteProduct : Product 인터페이스 구현 클래스

  • Creator : Product 타입의 객체를 반환하는 팩토리 메서드 선언

  • ConcreteCreator : 팩토리 메서드를 재정의하여 ConcreteProduct 인스턴스 반환

4. 예제 코드

커피(Product)를 주문한다고 가정해보자. 아메리카노(ConcreateProduct)와 바닐라 라떼(ConcreteProduct) 등을 주문할 수 있고, 커피를 만들어주는 주체(Creator)는 바리스타(ConcreteCreator)가 된다.

4-1. Product

[Coffee.java]

1
2
3
4
public interface Coffee {

    String getName();
}

4-2. ConcreteProduct

[Americano.java]

1
2
3
4
5
6
7
public class Americano implements Coffee {

    @Override
    public String getName() {
        return "Americano";
    }
}

[VanillaLatte.java]

1
2
3
4
5
6
7
public class VanillaLatte implements Coffee {

    @Override
    public String getName() {
        return "Vanilla Latte";
    }
}

4-3. Creator

[CoffeeCreator.java]

1
2
3
4
public interface CoffeeCreator {

    Coffee makeCoffee(String orderedCoffee);
}

4-4. ConcreteCreator

[Barista.java]

1
2
3
4
5
6
7
8
9
10
11
12
public class Barista implements CoffeeCreator {

    @Override
    public Coffee makeCoffee(String orderedCoffee) {
        if(orderedCoffee.equals("AMERICANO")) {
            return new Americano();
        } else if(orderedCoffee.equals("VANILLA_LATTE")) {
            return new VanillaLatte();
        }
        return null;
    }
}

5. 테스트

[Client.java]

1
2
3
4
5
6
7
8
9
10
11
12
public class Client {

    public static void main(String[] args) {
        CoffeeCreator coffeeCreator = new Barista();

        Coffee americano = coffeeCreator.makeCoffee("AMERICANO");
        Coffee vanillaLatte = coffeeCreator.makeCoffee("VANILLA_LATTE");

        System.out.println(americano.getName());
        System.out.println(vanillaLatte.getName());
    }
}

[실행 결과]

6. 특징

  • 객체를 한 곳에서 관리 : 객체들을 한 곳에서 관리하므로 생명 주기 등 체계적인 관리가 가능

  • 유연하고 확장성 있는 구조 : 새로운 클래스가 추가되더라도 기존 코드 변경 없이, 새로운 하위 클래스를 생성하여 처리 가능

Updated:

Leave a comment