본문 바로가기
디자인 패턴

[디자인 패턴] 팩토리 메서드(Factory Method) 패턴

by jeonghaemin 2022. 10. 22.
728x90

팩토리 메서드 패턴은 다양한 제품이 있을때 하나의 팩토리 클래스에서 모든 제품을 생성하는 책임을 가지는 것이 아닌, 각 제품의 생성을 책임지는 다양한 팩토리 클래스를 제공 함으로써 제품 요구사항에 변경이 생겨도 기존 코드를 유지할 수 있도록 해주는 패턴입니다.

예를 들어 다음과 같이 검은색, 핑크색 컵을 나타내는 클래스와 만드는 각각의 컵을 생성해주는 팩토리 클래스가 있다고 해보겠습니다.

public class CupFactory {

    public static Cup createCup(String color, int capacity) {
        if (color.equalsIgnoreCase("black")) {
            return new BlackCup(capacity);
        } else if (color.equalsIgnoreCase("pink")) {
            return new PinkCup(capacity);
        } else {
            throw new IllegalArgumentException("존재하지 않는 색상의 컵입니다.");
        }
    }
}

public class BlackCup extends Cup{
    public BlackCup(int capacity) {
        super("black", capacity);
    }
}

public class PinkCup extends Cup{
    public PinkCup(int capacity) {
        super("pink", capacity);
    }
}

public abstract class Cup {
    private String color;
    private int capacity; //컵 용량(ml)

    public Cup(String color, int capacity) {
        this.color = color;
        this.capacity = capacity;
    }

    public String getColor() {
        return color;
    }

    public int getCapacity() {
        return capacity;
    }
}

위 코드를 보면 지금 당장 검은색, 핑크색 컵을 만드는 데는 전혀 문제가 없는 것 같습니다. 하지만 새로운 색상의 컵이 추가된다면 어떻게 될까요? 새로운 색의 컵이 추가될 때마다 CupFactory 클래스의 팩토리 메서드 코드에 변경이 생기게 될 것입니다. 즉, SOLID 원칙 중 OCP(개방 폐쇄 원칙)을 위반하게 됩니다.

이러한 상황에서 팩토리 메서드 패턴을 사용하여 각각의 컵에 대한 전용 팩토리 클래스를 생성해서 사용하도록 변경하면 새로운 컵이 추가되어도 해당 컵에 대한 팩토리 클래스만 구현해주면 되기 때문에 OCP를 지킬 수 있게 됩니다.

public interface CupFactory {

    Cup createCup(int capacity);
}

//핑크색 컵을 생성하는 팩토리
public class PinkCupFactory implements CupFactory {

    @Override
    public Cup createCup(int capacity) {
        return new PinkCup(capacity);
    }
}

//검으색 컵을 생성하는 팩토리
public class BlackCupFactory implements CupFactory {

    @Override
    public Cup createCup(int capacity) {
        return new BlackCup(capacity);
    }
}

참고 : https://inf.run/JCAk

댓글