팩토리 패턴이란?상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴
- 상위 클래스에서는 객체 생성 방식에 대해 알 필요가 없어져 유연성을 갖게 되며 객체 생성 로직은 하위 클래스에서만 관리 되기 때문에 유지 보수성이 증가된다.
| 특징 | 설명 | 
|---|---|
| 유연성 | 새로운 객체 타입이 필요할 때마다 기존 코드를 변경하지 않고, 새로운 서브클래스를 추가하기만 하면 됩니다. | 
| 결합도 감소 | 클라이언트 코드가 구체적인 클래스 대신 인터페이스나 추상 클래스에 의존하므로, 시스템의 결합도가 낮아집니다. | 
| 확장성 | 새로운 객체 타입을 시스템에 쉽게 추가할 수 있어, 시스템의 확장성이 향상됩니다. | 
팩토리 패턴의 예시
package programmers;
enum CoffeeType {
	LATTE,
	ESPRESSO
}
abstract class Coffee {
	protected String name;
	
	public String getName() {
		return name;
	}
}
class Latte extends Coffee {
	public Latte() {
		name = "latte";
	}
}
class Espresso extends Coffee {
	public Espresso() {
		name = "Espresso";
	}
}
class CoffeeFactory{
	public static Coffee createCoffee(CoffeeType type) {
		switch(type) {
			case LATTE:
				return new Latte();
			case ESPRESSO:
				return new Espresso();
			default :
				throw new IllegalArgumentException("Invalid coffee type: " + type);
		}
		
	}
}
public class Main {
	
	public static void main(String[] args) {
		Coffee coffee = CoffeeFactory.createCoffee(CoffeeType.LATTE);
		System.out.println(coffee.getName());
	}
}
열거 타입 지정
CoffeeType열겨형은 사용 가능한 커피 타입을 정의한다. 이 예제에서는LATTE와ESPRESSO두가지 타입을 정의한다. 이 열겨형은 커피 생성 요청 시 요청된 커피 타입을 명확하게 지정하는데 사용된다.
Coffee 추상 클래스 정의
Coffee클래스는 모든 커피 객체의 상위 클래스로서, 커피 객체가 가져야 할 기본 속성과 메서드를 정의한다. 이 클래스는protected String name을 멤버 변수로 가지며, 이는 커피의 이름을 저장한다. 또한,public String getName()메서드를 통해 커피의 이름을 반환할 수 있다.
하위 클래스 Latte와 Espresso
Latte와Espresso클래스는Coffee추상 클래스를 상속받아 구현된 구체 클래스이다. 각 클래스의 생성자에서는 해당 커피 타입의 이름("latte","Espresso")을name변수에 할당한다. 이를 통해Coffee클래스의getName()메서드를 사용하여 커피의 이름을 얻을 수 있다.
클래스 CoffeeFactory
CoffeeFactory클래스는 팩토리 클래스로, 실제 커피 객체를 생성하는 정적 메서드
createCoffee(CoffeeType type)을 제공한다. 이 메서드는CoffeeType열거형을 인자로 받아, 해당 타입에 맞는 커피 객체(Latte또는Espresso)를 생성하고 반환한다. 만약 지원하지 않는 커피 타입이 요청되면IllegalArgumentException을 발생시킨다. 이 팩토리 클래스를 사용함으로써, 클라이언트는 커피 객체의 구체적인 클래스를 몰라도 원하는 타입의 커피 객체를 생성할 수 있다.
Main 클래스와 main 메서드
프로그램의 실행 진입점인
Main클래스의main메서드에서는CoffeeFactory.createCoffee(CoffeeType.LATTE)를 호출하여LATTE타입의 커피 객체를 생성하고, 생성된 커피 객체의 이름을 콘솔에 출력한다.
도식화
Main 메서드
  |
  v
CoffeeFactory.createCoffee(CoffeeType.LATTE)
  |
  |-> switch(type)
  |     |
  |     |-- case LATTE:
  |     |     |
  |     |     v
  |     |   new Latte()
  |     |
  |     |-- case ESPRESSO:
  |           |
  |           v
  |         new Espresso()
  |
  | (Coffee 객체 반환)
  v
System.out.println(coffee.getName())