팩토리 패턴

이강용·2024년 2월 19일
0

CS

목록 보기
19/109

팩토리 패턴이란?

상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴

  • 상위 클래스에서는 객체 생성 방식에 대해 알 필요가 없어져 유연성을 갖게 되며 객체 생성 로직은 하위 클래스에서만 관리 되기 때문에 유지 보수성이 증가된다.
특징설명
유연성새로운 객체 타입이 필요할 때마다 기존 코드를 변경하지 않고, 새로운 서브클래스를 추가하기만 하면 됩니다.
결합도 감소클라이언트 코드가 구체적인 클래스 대신 인터페이스나 추상 클래스에 의존하므로, 시스템의 결합도가 낮아집니다.
확장성새로운 객체 타입을 시스템에 쉽게 추가할 수 있어, 시스템의 확장성이 향상됩니다.

팩토리 패턴의 예시

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 열겨형은 사용 가능한 커피 타입을 정의한다. 이 예제에서는 LATTEESPRESSO 두가지 타입을 정의한다. 이 열겨형은 커피 생성 요청 시 요청된 커피 타입을 명확하게 지정하는데 사용된다.

Coffee 추상 클래스 정의

Coffee 클래스는 모든 커피 객체의 상위 클래스로서, 커피 객체가 가져야 할 기본 속성과 메서드를 정의한다. 이 클래스는 protected String name을 멤버 변수로 가지며, 이는 커피의 이름을 저장한다. 또한, public String getName() 메서드를 통해 커피의 이름을 반환할 수 있다.

하위 클래스 Latte와 Espresso

LatteEspresso 클래스는 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())
profile
HW + SW = 1

0개의 댓글