[디자인 패턴][생성 패턴] 팩토리 메서드 패턴(Factory Method Pattern)
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. 특징
-
객체를 한 곳에서 관리 : 객체들을 한 곳에서 관리하므로 생명 주기 등 체계적인 관리가 가능
-
유연하고 확장성 있는 구조 : 새로운 클래스가 추가되더라도 기존 코드 변경 없이, 새로운 하위 클래스를 생성하여 처리 가능
Leave a comment