ํฉํ ๋ฆฌ ๋ฉ์๋๋ ๋ฌด์์ผ๊น? ๋ฌด์์ด ์ข์๊น?
Factory Method
- ์ฌ์ฉํ ํด๋์ค๋ฅผ ์ ํํ ๋ชฐ๋ผ๋ ๊ฐ์ฒด ์์ฑ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ํจํด
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
์ ๋ฐํํ ์ ์๋ค.- ์์ฑ์๋ ์์ฑ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์์ธ๋ฅผ ๋์ง ์ ๋ฐ์ ์๋ค.
- swift๋ nilable initializer๊ฐ ๊ฐ๋ฅํ๋ค.
๋คํ์ ์ธ ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด
- ์ปต ์ฌ์ด์ฆ๋ ๋๋ผ๋ง๋ค ๋ค๋ฅด๋ค.
- ๊ฐ์ small, medium, large์ฌ๋ ๊ฐ ๋๋ผ๋ง๋ค ํด๋น ๊ท๊ฒฉ์ด ๋ค๋ฅผ ์ ์๊ธฐ ๋๋ฌธ
- ์ด๋ฐ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ๊ตฌํํ ๊น?
๋ฐฉ๋ฒ
createOrNull
์ ๋งค๊ฐ ๋ณ์๋กcountry
๋ฅผ ๋ฃ๋๋ค.- OO ์ ์ธ ๋ฐฉ๋ฒ์ ์๋
createOrNull
์ ๋คํ์ ์ผ๋ก ๋ง๋ ๋ค.Country
์์ ์ด๋ฅผ ์ฌ์ ์ํ์ฌ ์ฌ์ฉ- OO ์ ์ธ ๋ฐฉ๋ฒ
์์
// 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)
๋ ๊ฐ์ ์์ฑ์๋ผ๊ณ ๋ณผ ์ ์์
๋คํ์ ์ธ ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด 2
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;
}
}
}
- ๊ตฌ์ฒด์ ์ธ ๊ฒ๋ถํฐ ๋ง๋ค์ด์ ํ์ํ๋ฉด ์ถ์ํํด๋ผ
- ์ฒ์๋ถํฐ ์ถ์์ ์ธ ํจํด์ ์ฌ์ฉํ์ง ๋ง๋ผ.
ํฉํ ๋ฆฌ ๋ฉ์๋์ ์ฅ์
- ํด๋ผ์ด์ธํธ๋ ๋ณธ์ธ์๊ฒ ์ต์ํ ์ธ์๋ฅผ ํตํด ๊ฐ์ฒด ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
- ml๊ฐ ์๋, ์ฌ์ด์ฆ๋ก ์์ฑ ๊ฐ๋ฅ
- ์ค๋ฅ์ผ์
null
์ ๋ฐํํ ์ ์๋ค. - ๋คํ์ ์ผ๋ก ๊ฐ์ฒด ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
- ๊ทธ๋์ ๊ฐ์ ์์ฑ์ ํจํด์ด๋ผ๊ณ ๋ ํ๋ค.