팩토리 메서드는 무엇일까? 무엇이 좋을까?
public final class Cup {
private int sizeMl;
private Cup(int sizeMl) {
this.sizeMl = sizeMl;
}
public static Cup createOrNull(CupSize size) {
switch (size) {
case SMALL:
return new Cup(355);
case MEDIUM:
return new Cup(473);
case LARGE:
return new Cup(651);
default:
assert(false) : "Unhandled CupSize:" + size;
return null;
}
}
}
private
이라 생성을 무조건 정적 함수를 통해서 해야함null
을 반환할 수 있다.createOrNull
에 매개 변수로 country
를 넣는다.createOrNull
을 다형적으로 만든다.Country
에서 이를 재정의하여 사용// Cup
public final class Cup {
private int sizeMl;
Cup(int sizeMl) { // Package 접근 제어자
this.sizeMl = sizeMl;
}
public int getSize() {
return this.sizeMl;
}
}
// 왜 인터페이스 사용 안함? - 데이터가 들어갈 가능성이 높다고 판단했기 때문
public abstract class Menu {
// 다른 메서드 생략
public abstract Cup createCupOrNull(CupSize size); // 가상 생성자라고 볼 수 있음
}
public class AmericanMenu extends Menu {
@Override
public Cup createCupOrNull(CupSize size) {
switch (size) {
case SMALL:
return new Cup(473);
case MEDIUM:
return new Cup(621);
case LARGE:
return new Cup(887);
default:
assert(false) : "Unhandled CupSize:" + size;
return null;
}
}
}
// Korean 생략
createCupOrNull(CupSize size)
는 가상 생성자라고 볼 수 있음Cup
도 추상적일 수 있다.public abstract class Cup {
private int sizeMl;
protected Cup(int sizeMl) {
this.sizeMl = sizeMl;
}
public int getSize() {
return this.sizeMl;
}
}
public final class GlassCup extends Cup {
GlassCup(int sizeMl) {
super(sizeMl);
}
}
public final class PaperCup extends Cup {
private Lid lid;
PaperCup(int sizeMl, Lid lid) {
super(sizeMl);
this.lid = lid;
}
}
// 종이컵을 반환하는 것으로 변경됨
public class AmericanMenu extends Menu {
@Override
public Cup createCupOrNull(CupSize size) {
switch (size) {
case SMALL:
return new PaperCup(473);
case MEDIUM:
return new PaperCup(621);
case LARGE:
return new PaperCup(887);
default:
assert(false) : "Unhandled CupSize:" + size;
return null;
}
}
}
null
을 반환할 수 있다.