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
댓글