ð Chapter 9: ì ì°í ì€ê³
ð ê°ë°©-íì ìì¹â
- ê°ë°©-íì ìì¹ì ìíížìšìŽ ê°ì²Ž(íŽëì€, 몚ë, íšì ë±ë±)ë íì¥ì ëíŽ ìŽë € ììŽìŒ íê³ , ìì ì ëíŽìë ë«í ììŽìŒ íë€.
- íì¥ì ëíŽ ìŽë € ìë€: ì í늬ìŒìŽì ì ì구ì¬íìŽ ë³ê²œë ë ìŽ ë³ê²œì ë§ê² ìë¡ìŽ ëìì ì¶ê°íŽì ì í늬ìŒìŽì ì êž°ë¥ì íì¥í ì ìë€.
- ìì ì ëíŽ ë«í ìë€: êž°ì¡Žì ìœë륌 ìì íì§ ìê³ ë ì í늬ìŒìŽì ì ëìì ì¶ê°íê±°ë ë³ê²œí ì ìë€.
- ê°ë°©-íì ìì¹ì ì ì°í ì€ê³ë ìœë륌 ìì íì§ ìê³ ë ì í늬ìŒìŽì ì ëìì íì¥í ì ìë ì€ê³ê³ ìŽìŒêž°íë€.
ð 컎íìŒíì ìì¡Žì±ì ê³ ì ìí€ê³ ë°íì ìì¡Žì±ì ë³ê²œíëŒâ
- ë°íì ìì¡Žì±ì ì€íìì íë ¥ì ì°žì¬íë ê°ì²Žë€ ì¬ìŽì êŽê³ë€.
- 컎íìŒíì ìì¡Žì±ì ìœëìì ëë¬ëë íŽëì€ë€ ì¬ìŽì êŽê³ë€.
- ê°ë°©-íì ìì¹ì ìì©íë ìœëë 컎íìŒíì ìì¡Žì±ì ìì íì§ ìê³ ë ë°íì ìì¡Žì±ì ìœê² ë³ê²œí ì ìë€.
- ìì¡Žì± êŽì ìì ê°ë°©-íì ìì¹ì ë°ë¥Žë ì€ê³ë 컎íìŒíì ìì¡Žì±ì ì ì§íë©Žì ë°íì ìì¡Žì±ì ê°ë¥ì±ì íì¥íê³ ìì í ì ìë 구조ëŒê³ í ì ìë€.
ð ì¶ìíê° íµì¬ìŽë€â
- ê°ë°©-íì ìì¹ì íµì¬ì ì¶ìíì ìì¡Žíë ê²ìŽë€.
- ì¶ìí 곌ì ì ê±°ì¹ë©Ž ë¬žë§¥ìŽ ë°ëëëŒë ë³íì§ ìë ë¶ë¶ë§ ëšê² ëê³ ë¬žë§¥ì ë°ëŒ ë³íë ë¶ë¶ì ìëµëë€.
- ê°ë°©-íì ìì¹ì êŽì ìì ìëµëì§ ìê³ ëšê²šì§ë ë¶ë¶ì ë€ìí ìí©ììì ê³µíµì ì ë°ìí ì¶ìíì 결곌묌ìŽë€. ê³µíµì ìž ë¶ë¶ì ë¬žë§¥ìŽ ë°ëëëŒë ë³íì§ ìììŒ íë€. ê³µíµì ìž ë¶ë¶ì ë¬žë§¥ìŽ ë°ëëëŒë ë³íì§ ìììŒ íë€. ë€ì ë§íŽì ìì í íìê° ììŽìŒ íë€. ë°ëŒì ì¶ìí ë¶ë¶ì ìì ì ë«í ìë€.
- ì¶ìí륌 íµíŽ ìëµë ë¶ë¶ì íì¥ì ì¬ì§ë¥Œ ëšêžŽë€. ìžì ëŒë ì¶ìíì ìëµë ë¶ë¶ì ì±ìë£ììŒë¡ìš ìë¡ìŽ 묞맥ì ë§ê² êž°ë¥ì íì¥í ì ìë€. ë°ëŒì ì¶ìíë ì€ê³ì íì¥ì ê°ë¥íê² íë€.
- ê°ë°©-íì ìì¹ìì íì륌 ê°ë¥íê² íë ê²ì ìì¡Žì±ì ë°©í¥ìŽë€. ìì ì ëí ìí¥ì ìµìííêž° ìíŽìë 몚ë ììê° ì¶ìíì ìì¡ŽíŽìŒ íë€. (
Movie
ë í ìž ì ì± ì ì¶ìííDiscountPolicy
ì ëíŽì ìì¡Ž) - 죌ìí ì ì ì¶ìí륌 íë€ ê³ íŽì 몚ë ìì ì ëíŽ ì€ê³ê° íìëë ê²ì ìëë€. ë³ê²œì ìí íêžíšê°ë¥Œ ìµëí íŒíêž° ìíŽìë ë³íë ê²ê³Œ ë³íì§ ìë ê²ìŽ 묎ììžì§ë¥Œ ìŽíŽíê³ ìŽë¥Œ ì¶ìíì 목ì ìŒë¡ ìŒììŒë§ íë€.
ð ìì± ì¬ì© ë¶ëŠ¬â
- ê²°í©ëê° ëìì§ìë¡ ê°ë°©-íì ìì¹ì ë°ë¥Žë 구조륌 ì€ê³íêž°ê° ìŽë €ìì§ë€. ìììŒ íë ì§ììŽ ë§ìŒë©Ž ê²°í©ëê° ëìì§ë€.
- ê°ì²Žì íì 곌 ìì±ìì ì ë¬íŽìŒ íë ìžìì ëí 곌ëí ì§ìì ìœë륌 í¹ì í 컚í ì€ížì ê°íê² ê²°í©ìíšë€.
- ëìŒí íŽëì€ ììì ê°ì²Ž ìì±ê³Œ ì¬ì©ìŽëŒë ë ê°ì§ ìŽì§ì ìž ëª©ì ì ê°ì§ ìœëê° ê³µì¡Žíë ê²ìŽ 묞ì ìŽë€.
- ì ì°íê³ ì¬ì¬ì© ê°ë¥í ì€ê³ë¥Œ ìíë€ë©Ž ê°ì²Žì êŽë šë ë ê°ì§ ì± ìì ìë¡ ë€ë¥ž ê°ì²Žë¡ ë¶ëŠ¬íŽìŒ íë€. íëë ê°ì²Žë¥Œ ìì±íë ê²ìŽê³ , ë€ë¥ž íëë ê°ì²Žë¥Œ ì¬ì©íë ê²ìŽë€.
- í ë§ëë¡ ë§íŽì ê°ì²Žì ëí ìì±ê³Œ ì¬ì©ì ë¶ëŠ¬íŽìŒ íë€.
- ì¬ì©ìŒë¡ë¶í° ìì±ì ë¶ëŠ¬íë ë° ì¬ì©ëë ê°ì¥ 볎ížì ìž ë°©ë²ì ê°ì²Žë¥Œ ìì±í ì± ìì íŽëŒìŽìžížë¡ ì®êž°ë ê²ìŽë€.
public class Client {
public Money getAvatarFee() {
Movie avatar = new Movie("ìë°í",
Duration.ofMinutes(120),
Money.wons(10000),
new AmountDiscountPolicy(...)
);
return avatar.getFee();
}
}
ð FACTORY ì¶ê°íêž°â
- ì ìœëìì
Movie
ì ìì± ì± ììClient
ë¡ ì®ê²Œë€. ë§ìœClient
ë í¹ì í 컚í ì€ížì 묶ìŽì§ ìꞰ륌 ë°ëë€ê³ ê°ì íë©ŽClient
ë ìì±íë ëììgetFee
ë©ìì§ë íšê» ì ì¡íê³ ìë€. ìŠ, ìì±ê³Œ ì¬ì©ì ì± ìì íšê» ì§ëê³ ìë€. - ìŽ ë¬žì ë
Movie
ì 묞ì 륌 íŽê²°íë ë°©ë²ê³Œ ëìŒí ë°©ë²ìŒë¡ íŽê²°í ì ìë€. - ìŽ ê²œì° ê°ì²Ž ìì±ê³Œ êŽë šë ì±
ìë§ ì ëŽíë ë³ëì ê°ì²Žë¥Œ ì¶ê°íê³
Client
ë ìŽ ê°ì²Žë¥Œ ì¬ì©íëë¡ ë§ë€ ì ìëë° ìŽ ì²ëŒ ìì±ê³Œ ì¬ì©ì ë¶ëŠ¬íêž° ìíŽ ê°ì²Ž ìì±ì í¹íë ê°ì²Žë¥Œ FACTORYëŒê³ ë¶ë¥žë€.
public class Factory {
public Movie createAvatarMovie() {
return new Movie("ìë°í",
Duration.ofMinutes(120),
Money.wons(1000),
new AmountDiscountPolicy(...)
);
}
}
- ìŽì
Client
ëFactory
륌 ì¬ì©íŽì ìì±ëMovie
ì ìžì€íŽì€ë¥Œ ë°íë°ì ì¬ì©íêž°ë§ íë©Ž ëë€.
public class Client {
private Factory factory;
public Client(FACTORY factory) {
this.factory = factory;
}
public Money getAvatarFee() {
Movie avatar = factory.createAvatarMovie();
return avatar.getFee();
}
}
ð ììí ê°ê³µë¬Œìê² ì± ì í ë¹íêž°â
- ì± ì í ë¹ì ê°ì¥ êž°ë³žìŽ ëë ìì¹ì ì± ìì ìííë ë° íìí ì 볎륌 ê°ì¥ ë§ìŽ ìê³ ìë INFORMATION EXPERTìê² ì± ìì í ë¹íë ê²ìŽë€. ëë©ìž 몚ëžì INFORMATION EXPERT륌 ì°Ÿêž° ìíŽ ì°žì¡°í ì ìë ìŒì°šì ìž ì¬ë£ë€. ìŽë€ ì± ìì í ë¹íê³ ì¶ë€ë©Ž ì ìŒ ëšŒì ëë©ìž ëªšëž ìì ê°ë ì€ìì ì ì í íë³Žê° ì¡Žì¬íëì§ ì°ŸìëŽìŒ íë€.
- FACTORYë ëë©ìž 몚ëžì ìíì§ ìëë€. FACTORY륌 ì¶ê°í ìŽì ë ììíê² êž°ì ì ìž ê²°ì ìŽë€. ì 첎ì ìž ê²°í©ë륌 ë®ì¶ê³ ì¬ì¬ì©ì±ì ëìŽêž° ìíŽ ëë©ìž ê°ë ìê² í ë¹ëŒ ìë ê°ì²Ž ìì± ì± ìì ëë©ìž ê°ë 곌ë ìë¬Žë° ìêŽã ë ìë ê°ê³µì ê°ì²Žë¡ ìŽëìíš ê²ìŽë€.
- ìì€í ì ê°ì²Žë¡ ë¶íŽíë ë° í¬ê² ë ê°ì§ ë°©ììŽ ì¡Žì¬íëë° íëë ííì ë¶íŽìŽê³ ë€ë¥ž íëë íìì ë¶íŽë€.
- ííì ë¶íŽë ëë©ìžì ì¡Žì¬íë ì¬ë¬Œ ëë ê°ë ì íííë ê°ì²Žë€ì ìŽì©íŽ ìì€í ì ë¶íŽíë ê²ìŽë€. ííì ë¶íŽë ëë©ìž 몚ëžì ëŽê²š ìë ê°ë 곌 êŽê³ë¥Œ ë°ë¥Žë©° ëë©ìžê³Œ ìíížìšìŽ ì¬ìŽì ííì ì°šìŽë¥Œ ìµìííë ê²ì 목ì ìŒë¡ íë€.
- ê·žë¬ë ì¢ ì¢ ëë©ìž ê°ë ì íííë ê°ì²Žìê² ì± ì ì í ë¹íë ê²ë§ìŒë¡ ë¶ì¡±í 겜ì°ê° ë°ìíë€. 몚ë ì± ìì ëë©ìž ê°ì²Žì í ë¹íë©Ž ë®ì ìì§ë, ëì ê²°í©ë, ì¬ì¬ì©ì± ì íì ê°ì ì¬ê°í 묞ì ì ì ëŽì°©íê² ë ê°ë¥ì±ìŽ ëìì§ë€. ìŽ ê²œì° ëë©ìž ê°ë ì ííí ê°ì²Žê° ìë ì€ê³ìê° ížì륌 ìíŽ ììŒë¡ ë§ë€ìŽëž ê°ê³µì ê°ì²Žìê² ì± ìì í ë¹íŽì 묞ì 륌 íŽê²°íŽìŒ íëë° ìŽì²ëŒ ì± ìì í ë¹íêž° ìíŽ ì°œì¡°ëë ëë©ìžê³Œ 묎êŽí ìžê³µì ìž ê°ì²Žë¥Œ PURE FABRICATION(ììí ê°ê³µë¬Œ)ìŽëŒê³ ë¶ë¥žë€.
- ìŽë€ íëì ì¶ê°íë €ê³ íëë° ìŽ íëì ì± ìì§ ë§ë í ëë©ìž ê°ë ìŽ ì¡Žì¬íì§ ìëë€ë©Ž PURE FABRICATIONì ì¶ê°íê³ ìŽ ê°ì²Žìê² ì± ìì í ë¹íŽìŒ íë€. ê·ž ê²°ê³Œë¡ ë³Žíµ í¹ì í íëì íííë ê²ìŽ ìŒë°ì ìŽë€. ë°ëŒì PURE FABRICATIONì ííì ë¶íŽë³Žë€ íìì ë¶íŽì ìíŽ ìì±ëë€.
- 뚌ì ëë©ìžì 볞ì§ì ìž ê°ë ì íííë ì¶ìí륌 ìŽì©íŽ ì í늬ìŒìŽì ì 구ì¶íê³ ë§ìœ ëë©ìž ê°ë ìŽ ë§ì¡±ì€ëœì§ 못íë€ë©Ž ìžê³µì ìž ê°ì²Žë¥Œ 찜조íë€.
- FACTORYë ê°ì²Žì ìì± ì± ìì í ë¹í ë§í ëë©ìž ê°ì²Žê° ì¡Žì¬íì§ ìì ë ì íí ì ìë PURE FABRICATIONì í¬íšíë€.
ð ìì¡Žì± ì£Œì â
- ì¬ì©íë ê°ì²Žê° ìë ìžë¶ì ë 늜ì ìž ê°ì²Žê° ìžì€íŽì€ë¥Œ ìì±í í ìŽë¥Œ ì ë¬íŽì ìì¡Žì±ì íŽê²°íë ë°©ë²ì ìì¡Žì± ì£Œì ìŽëŒê³ ë¶ë¥žë€.
- ìŽ êž°ë²ì ìžë¶ìì ìì¡Žì±ì ëìì íŽê²°í í ìŽë¥Œ ì¬ì©íë ê°ì²Ž 쪜ì 죌ì íë€.
- ìì¡Žì± ì£Œì ì ìì¡Žì± íŽê²° ë°©ë²ê³Œ êŽë šìŽ ê¹ë€. (ìì±ì 죌ì , setter 죌ì , ë©ìë 죌ì )
- ë€ì ìì ë
Movie
ì ìì±ì륌 ìŽì©íŽ ìì¡Žì±ì 죌ì íêž° ë묞ì ìì±ì 죌ì ìŽëŒê³ ë¶ë¥žë€.
Movie avatar = new Movie("ìë°í",
Duration.ofMinutes(120),
Money.wons(10000),
new AmountDiscountPolicy(...)
);
setter
죌ì ì ìŽë¯ž ìì±ëMovie
ì ëíŽsetter
ë©ìë륌 ìŽì©íŽ ìì¡Žì±ì íŽê²°íë€.setter
죌ì ì ì¥ì ì ìì¡Žì± ëìì ë°íìì ë³ê²œí ì ìë€. ìžì ëŒë ìì¡Ž ëìì êµì²Ží ì ìë€.- ëšì ì ê°ì²Žê° ì¬ë°ë¥Žê² ìì±ëêž° ìíŽ ìŽë€ ìì¡Žì±ìŽ íìì ìžì§ë¥Œ ëª ìì ìŒë¡ ííí ì ìë€.
avatar.setDiscountPolicy(new AmountDiscountPolicy(...));
- ë©ìë 죌ì ì ë©ìë ížì¶ 죌ì ìŽëŒê³ ë ë¶ë¥Žë©° ë©ìëê° ìì¡Žì±ì íìë¡ íë ì ìŒí 겜ì°ìŒ ë ì¬ì©í ì ìë€.
avatar.calculateDiscountAmount(screening, new AmountDiscountPolicy(...));
ð ìšê²šì§ ìì¡Žì±ì ëìë€â
- ìì¡Žì± ì£Œì ìžì ìì¡Žì±ì íŽê²°í ì ìë ë°©ë² ì€ íëìž SERVICE LOCATOR íšíŽìŽ ìë€.
- ìŽ íšíŽì ìì¡Žì±ì íŽê²°í ê°ì²Žë€ì 볎êŽíë ìŒì¢ ì ì ì¥ìë€. ìžë¶ìì ê°ì²Žìê² ìì¡Žì±ì ì ë¬íë ìì¡Žì± ì£Œì 곌 ë¬ëŠ¬ SERVICE LOCATORì ê²œì° ê°ì²Žê° ì§ì SERVICE LOCATORìê² ìì¡Žì±ì íŽê²°íŽì€ ê²ì ìì²íë€.
- ì륻 ë€ìŽ
ServiceLocator
ëŒë íŽëì€ê° SERVICE LOCATORì ìí ì ìííê³Movie
ë ì§ì ServiceLocator
ì ë©ìë륌 ížì¶íŽìDiscountPolicy
ì ëí ìì¡Žì±ì íŽê²°íë€.
public class Movie {
// ...
private DiscountPolicy discountPolicy;
public Movie(String title, Duration runningTime, Money fee) {
this.title = title;
this.runningTime = runningTime;
this.fee = fee;
this.discountPolicy = ServiceLocator.discountPolicy();
}
}
ServiceLocator
ëDiscountPolicy
ì ìžì€íŽì€ë¥Œ ë±ë¡íê³ ë°íí ì ìë ë©ìë륌 구íí ì ì¥ìë€.
public class ServiceLocator {
private static ServiceLocator soleInstance = new ServiceLocator();
private DiscountPolicy discountPolicy;
public static DiscountPolicy discountPolicy() { // ìžì€íŽì€ ë°í
return soleInstance.discountPolicy;
}
public static void provide(DiscountPolicy discountPolicy) { // ìžì€íŽì€ ë±ë¡
soleInstance.discountPolicy = discountPolicy;
}
private ServiceLocator() {}
}
- ë€ì곌 ê°ìŽ ìžì€íŽì€ë¥Œ
ServiceLocator
ì ìžì€íŽì€ë¥Œ ë±ë¡í íMovie
륌 ìì±íë©Ž ëë€.
ServiceLocator.provide(new AmountDiscountPolicy(...));
Movie avatar = new Movie("ìë°í",
Duration.ofMinutes(120),
Money.wons(10000)
);
ServiceLocator.provide(new PercentDiscountPolicy(...));
Movie avatar = new Movie("ìë°í",
Duration.ofMinutes(120),
Money.wons(10000)
);
- SERVICE LOCATOR íšíŽì ê°ì¥ í° ëšì ì ìì¡Žì±ì ê°ì¶ë€.
Movie
ëDiscountPolicy
ì ìì¡Žíê³ ìì§ë§Movie
ì íŒëžëŠ ìží°íìŽì€ ìŽëìë ìŽ ìì¡Žì±ì ë í ì ë³Žê° íìëŒ ìì§ ìë€. - ìì¡Žì±ì 구í ëŽë¶ë¡ ê°ì¶ ê²œì° ìì¡Žì±ê³Œ êŽë šë 묞ì ê° ì»ŽíìŒíììŽ ìë ë°íìì ê°ììŒ ë°ê²¬ëë€ë ì¬ì€ì ì ì ìë€. ìšê²šì§ ìì¡Žì±ìŽ ìŽíŽíêž° ìŽë µê³ ëë²ê¹ íêž° ìŽë €ìŽ ìŽì ë 묞ì ì ì ë°ê²¬í ì ìë ìì ì ìœë ìì± ìì ìŽ ìëëŒ ì€í ìì ìŒë¡ 믞룚Ʞ ë묞ìŽë€. ìì¡Žì±ì ìšêž°ë ìœëë ëšì í ì€íž ìì±ë ìŽë µë€.
- ìšê²šì§ ìì¡Žì±ìŽ ê°ì§ë ê°ì¥ í° ë¬žì ì ì ìì¡Žì±ì ìŽíŽíêž° ìíŽ ìœëì ëŽë¶ 구íì ìŽíŽí ê²ì ê°ìíë€. ë°ëŒì ìšê²šì§ ìì¡Žì±ì 캡ìí륌 ìë°íë€. 결곌ì ìŒë¡ ìì¡Žì±ì 구í ëŽë¶ë¡ ê°ì¶ëë¡ ê°ìíë SERVICE LOCATORë 캡ìí륌 ìë°í ìë°ì ìë€.
- ëª ìì ìž ìì¡Žì±ìŽ ìšê²šì§ ìì¡Žì±ë³Žë€ ì¢ë€. ê°êžì ìì¡Žì±ì ê°ì²Žì íŒëžëŠ ìží°íìŽì€ì ë žì¶íŽìŒ íë€.
- ê°ë¥íë€ë©Ž ìì¡Žì±ìŒ ëª ìì ìŒë¡ ííí ì ìë êž°ë²ì ì¬ì©íëŒ.
ð ìì¡Žì± ìì ìì¹â
ð ì¶ìíì ìì¡Žì± ìì â
- ê°ì²Ž ì¬ìŽì íë ¥ìŽ ì¡Žì¬í ë ê·ž íë ¥ì 볞ì§ì ëŽê³ ìë ê²ì ìì ìì€ì ì ì± ìŽë€. (í ìž êžì¡ì ê³ì°í ê²ìžì§ê° ìë ìí륌 ê³ì°íë ê²) ë€ì ë§íŽì ìŽë€ íë ¥ìì ì€ìí ì ì± ìŽë ìì¬ê²°ì , ë¹ìŠëì€ì 볞ì§ì ëŽê³ ìë ê²ì ìì ìì€ì íŽëì€ë€.
- ìì ìì€ì íŽëì€ë ìŽë€ ììŒë¡ë íì ìì€ì íŽëì€ì ìì¡ŽíŽìë ì ëë€. (
Movie
ëAmountDiscountPolicy
ì ìì¡ŽíŽìë ì ëë€.) - ìì ìì€ì íŽëì€ê° íì ìì€ì íŽëì€ì ìì¡Žíë©Ž ìì ìì€ì íŽëì€ë¥Œ ì¬ì¬ì©í ë íì ìì€ì íŽëì€ë íìíêž° ë묞ì ì¬ì¬ì©íêž°ê° ìŽë €ìì§ë€.
- íì ìì€ì ë³ê²œìŒë¡ ìžíŽ ìì ìì€ìŽ ë³ê²œëŒìë ì ëë€.
- ìŽ ê²œì°ìë íŽê²°í ë°©ë²ì ì¶ìíë€. (
Movie
ìAmountDiscountPolicy
ì¬ìŽì ì¶ì íŽëì€ìžDiscountPolicy
) ìì ìì€ì íŽëì€ì íì ìì€ì íŽëì€ ëªšë ì¶ìíì ìì¡Žíë€. - ì ì°íê³ ì¬ì¬ì© ê°ë¥í ì€ê³ë¥Œ ìíë€ë©Ž 몚ë ìì¡Žì±ì ë°©í¥ìŽ ì¶ì íŽëì€ë ìží°íìŽì€ì ê°ì ì¶ìí륌 ë°ëŒìŒ íë€. 구첎 íŽëì€ë ìì¡Žì±ì ììì ìŽìŽìŒ íë€.
- ìì¡Žì± ìì ìì¹ìŽë ìì ìì€ì 몚ëì íì ìì€ì 몚ëì ìì¡ŽíŽì ìëê³ , ì¶ìíë 구첎ì ìž ì¬íì ìì¡ŽíŽìë ì ëë€ë ê²ìŽë€. ìŠ, ììì íì ìì€ì 몚ë ë ë€ ì¶ìíì ìì¡ŽíŽìŒ íê³ , 구첎ì ìž ì¬íì ì¶ìíì ìì¡ŽíŽìŒ íë€.
ð ìì¡Žì± ìì ìì¹ê³Œ íší€ì§â
- ìì ì ìì¡Žì±ì ë°©í¥ë¿ë§ ìëëŒ ìží°íìŽì€ì ìì ê¶ìë ì ì©ëë€.
Movie
ì ì¬ì¬ì©ì ìíŽ íìí ê²ìŽDiscountPolicy
ë¿ìŽëŒë©ŽDiscountPolicy