Computer Science/Design Pattern

[CS / Design Pattern] 팩토리 패턴의 모든 것!

newtownboy 2024. 4. 5. 14:40


[Version]
⦁ 2024.04.05 / [Design Pattern] 팩토리 패턴의 모든 것!
 

팩토리 패턴

팩토리 패턴은 객체 생성을 추상화하여 상속 관계에 있는 클래스들 간의 결합도를 낮추는 디자인 패턴이다. 이는 객체를 사용하는 코드에서 객체를 생성하는 부분을 분리하여 객체 생성 로직과 객체 사용 로직을 독립적으로 다룰 수 있도록 해준다.

 

상위 클래스는 객체의 뼈대를 정의하고, 하위 클래스는 구체적인 객체 생성 방법을 결정한다. 이를 통해 상위 클래스는 객체 생성 방법에 대해 알 필요가 없으며 이는 느슨한 결합을 가능하게 한다. 또한 객체 생성 로직이 분리되어 있기 때문에 코드의 유지보수성이 향상된다.

 

팩토리 패턴을 설명할 때 라뗴 레시피와 아메리카노 레시피가 있는 하위 클래스를 컨베이어 벨트를 통해 상위 클래스인 바리스타 공장에 전달되는 상황을 예로 들 수 있다. 이러한 상황에서 바리스타 공장은 받은 레시피에 따라 라떼 또는 아메리카노를 생산하는 생산 공정을 수행한다.


팩토리 패턴의 구현 (Java)

// 상위 클래스: 음료 추상화
abstract class Beverage {
    abstract void prepare();
}

// 하위 클래스: 라떼
class Latte extends Beverage {
    @Override
    void prepare() {
        System.out.println("라떼를 만듭니다.");
        // 라떼를 만드는 구체적인 과정을 작성
    }
}

// 하위 클래스: 아메리카노
class Americano extends Beverage {
    @Override
    void prepare() {
        System.out.println("아메리카노를 만듭니다.");
        // 아메리카노를 만드는 구체적인 과정을 작성
    }
}

// 팩토리 클래스: 음료를 생성하는 공장
class BeverageFactory {
    // 음료 종류에 따라 해당하는 객체를 생성하여 반환
    Beverage createBeverage(String type) {
        switch (type) {
            case "LATTE":
                return new Latte();
            case "AMERICANO":
                return new Americano();
            default:
                throw new IllegalArgumentException("해당 음료는 제조할 수 없습니다.");
        }
    }
}

// 클라이언트 코드: 바리스타 공장을 이용하여 음료를 생성
public class Main {
    public static void main(String[] args) {
        BeverageFactory factory = new BeverageFactory();

        // 라떼 생성
        Beverage latte = factory.createBeverage("LATTE");
        latte.prepare();

        // 아메리카노 생성
        Beverage americano = factory.createBeverage("AMERICANO");
        americano.prepare();
    }
}

위 코드는 팩토리 패턴을 사용하여 라떼와 아메리카노를 생성하는 예시이다. 팩토리 클래스인 BeverageFactory에서는 음료 종류에 따라 해당하는 객체를 생성하여 반환하고 클라이언트 코드에서는 바리스타 공장을 통해 음료를 생성한다.