팩토리 패턴

팩토리 메서드 패턴(Factory method pattern)은 객체지향 디자인 패턴이다. Factory method는 부모(상위) 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며. 자식(하위) 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴이기도 하다. 부모(상위) 클래스 코드에 구체 클래스 이름을 감추기 위한 방법으로도 사용한다. [출처: 위키피디아]

객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴이자 상위 클래스가 중요한 뼈대를 결정하고 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정한다.

상위와 하위로 나누어지기 때문에 결합도가 낮고 상위 클래스는 하위 클래스에 관여하지 않으므로 유연성이 높다.

장점

클래스를 기반으로 객체를 만들지 않고 호출이 가능하며, 해당 메소드에 대한 메모리 할당을 한번만 할 수 있다는 장점이 있음

  1. 객체 생성의 캡슐화:

    팩토리 패턴은 객체 생성을 캡슐화하므로 클라이언트는 객체를 직접 생성하는 것이 아니라 팩토리를 통해 객체를 얻을 수 있습니다. 이로써 객체 생성에 대한 세부사항이 클라이언트 코드로부터 분리되어 캡슐화됩니다.

  2. 중복된 코드 제거:

    객체 생성 코드가 여러 곳에서 중복되는 것을 방지할 수 있습니다. 객체 생성 로직을 팩토리에 중앙 집중시켜 중복을 최소화할 수 있습니다.

단점

  1. 복잡성 증가:

    팩토리 패턴을 도입하면서 코드가 더 복잡해질 수 있습니다. 객체 생성을 추상화하고 캡슐화하는 추가적인 인터페이스 및 클래스가 필요하며, 이로 인해 코드의 양이 늘어날 수 있습니다.

  2. 유연성 부족:

    일부 상황에서는 팩토리 패턴이 유연성을 제한할 수 있습니다. 팩토리가 객체 생성에 대한 제어를 가져가기 때문에, 클라이언트가 직접 객체를 생성하는 것에 비해 유연성이 감소할 수 있습니다

## 팩토리 패턴 코드

enum CoffeeType {
    LATTE,
    ESPRESSO
}

abstract class Coffee {
    protected String name;
    protected int price;

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Coffee{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

class Latte extends Coffee {
    public Latte(int price) {
        name = "latte";
        this.price = price;
    }
}

class Espresso extends Coffee {
    public Espresso(int price) {
        name = "Espresso";
        this.price = price;

    }
}

class CoffeeFactory {
    public static Coffee createCoffee(CoffeeType type, int price) {
        switch (type) {
            case LATTE:
                return new Latte(price);
            case ESPRESSO:
                return new Espresso(price);
            default:
                throw new IllegalArgumentException("Invalid coffee type: " + type);
        }
    }
}

public class Factory {
    public static void main(String[] args) {
        Coffee coffee = CoffeeFactory.createCoffee(CoffeeType.ESPRESSO, 1000);
        System.out.println(coffee);
    }
}

// Coffee{name='Espresso', price=1000}

참고 도서 - 면접을 위한 CS 전공지식 노트

Leave a comment