JavaRush /Java Blog /Random-KO /ํ”ผ์ž ๊ฐ€๊ฒŒ ๋ฌธ์ œ. ๋นŒ๋” ๋Œ€ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ.
CynepHy6
๋ ˆ๋ฒจ 34
ะ’ะตะปะธะบะธะน ะะพะฒะณะพั€ะพะด

ํ”ผ์ž ๊ฐ€๊ฒŒ ๋ฌธ์ œ. ๋นŒ๋” ๋Œ€ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ.

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค

๋ฌธ์ œ์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์น˜ํ‚จ, ์•„๋ฉ”๋ฆฌ์นธ, ๋ฏธํŠธ, ํ•˜์™€์ด์•ˆ, ํŽ˜ํผ๋กœ๋‹ˆ ๋“ฑ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ํ”ผ์ž๋ฅผ ์ค€๋น„ํ•˜๋ ค๋Š” ํ”ผ์ž ๊ฐ€๊ฒŒ์˜ ๊ฒฝ์šฐ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•œ ํ…œํ”Œ๋ฆฟ๊ณผ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ „ํ†ต์ ์œผ๋กœ Builder ํ…œํ”Œ๋ฆฟ์€ "ํ”ผ์ž ๋ฌธ์ œ"๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Decorator ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ ์˜ˆ๋„ ์žˆ๋Š”๋ฐ, ๋‘ ํŒจํ„ด ๋ชจ๋‘ ๋งž์ง€๋งŒ ์‚ฌ์šฉ๋ฒ•์—๋Š” ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Builder๋Š” ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์ธ ๋ฐ˜๋ฉด, Decorator๋Š” ์™„์„ฑ๋œ ๊ฐœ์ฒด๋ฅผ ์ฆ‰์‹œ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๊ฒƒ์„ ์ดํ•ดํ•ด ๋ด…์‹œ๋‹ค:

1. ํ…œํ”Œ๋ฆฟ ๋นŒ๋”:

์ด ๊ฒฝ์šฐ ํ”ผ์ž๋Š” ๋ชจ๋“  ์žฌ๋ฃŒ๋ฅผ ํ•œ ๋ฒˆ์— ์ค€๋น„๋ฉ๋‹ˆ๋‹ค.
ํ”ผ์ž ์ˆ˜์—…:
public class Pizza{ private float totalPrice = 0; private Size size; private Topping topping; private Crust crust; private Cheese cheese; public Size getSize(){ return size; } public void setSize(Size size){ this.size = size; } public Topping getTopping(){ return topping; } public void setTopping(Topping topping){ this.topping = topping; } public Crust getCrust(){ return crust; } public void setCrust(Crust crust){ this.crust = crust; } public Cheese getCheese(){ return cheese; } public void setCheese(Cheese cheese){ this.cheese = cheese; } public float getTotalPrice(){ return totalPrice; } public void addToPrice(float price){ this.totalPrice = totalPrice + price; } }
4๊ฐœ์˜ ์—ด๊ฑฐํ˜• ํด๋ž˜์Šค:
public enum Cheese { AMERICAN{ public float getCost(){ return 40; } }, ITALIAN { public float getCost(){ return 60; } }; public abstract float getCost(); } public enum Crust { THIN{ public float getCost(){ return 70; } } , STUFFED{ public float getCost(){ return 90; } }; public abstract float getCost(); } public enum Size { MEDIUM { public float getCost() { return 100; } }, LARGE { public float getCost() { return 160; } }; public abstract float getCost(); } public enum Topping { PEPPERONI { public float getCost(){ return 30; } }, CHICKEN{ public float getCost(){ return 35; } }, MUSHROOM{ public float getCost(){ return 20; } }; public abstract float getCost(); }
PizzaBuilder ํด๋ž˜์Šค:
public class PizzaBuilder { Pizza pizza = new Pizza(); public PizzaBuilder withTopping(Topping topping) { pizza.setTopping(topping); pizza.addToPrice(topping.getCost()); return this; } public PizzaBuilder withSize(Size size) { pizza.setSize(size); pizza.addToPrice(size.getCost()); return this; } public PizzaBuilder withCrust(Crust crust) { pizza.setCrust(crust); pizza.addToPrice(crust.getCost()); return this; } public Pizza build() { return pizza; } public double calculatePrice() { return pizza.getTotalPrice(); } }
์ˆ˜์—… ํ…Œ์ŠคํŠธ:
public class PizzaBuilderTest { @Test public void shouldBuildThinCrustChickenPizza(){ Pizza pizza = new PizzaBuilder().withCrust(Crust.THIN).withTopping(Topping.CHICKEN).withSize(Size.LARGE).build(); assertEquals(Topping.CHICKEN,pizza.getTopping()); assertEquals(Size.LARGE,pizza.getSize()); assertEquals(Crust.THIN,pizza.getCrust()); assertEquals(265.0,pizza.getTotalPrice(),0); } }

2. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํ…œํ”Œ๋ฆฟ:

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด์€ ์›๋ณธ ๊ฐ์ฒด์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ๋™์ ์œผ๋กœ ๊ฐ์ฒด์— ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ”ผ์ž ๋ฒ ์ด์Šค๋ฅผ ๋จผ์ € ๋งŒ๋“  ํ›„ ๋‹ค์–‘ํ•œ ์žฌ๋ฃŒ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์žฅ์‹ํ•˜๋ ค๋Š” BasePizza(๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ)์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค(Pizza)์™€ ์‹ค์ œ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” PizzaDecorator ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
ํ”ผ์ž ์ธํ„ฐํŽ˜์ด์Šค:
public interface Pizza { public String bakePizza(); public float getCost(); }
BasePizza ๊ตฌํ˜„:
public class BasePizza implements Pizza{ public String bakePizza() { return "Basic Pizza"; } public float getCost(){ return 100; } }
PizzaDecorator ํด๋ž˜์Šค:
public class PizzaDecorator implements Pizza { Pizza pizza; public PizzaDecorator(Pizza newPizza) { this.pizza = newPizza; } public String bakePizza() { return pizza.bakePizza(); } @Override public float getCost() { return pizza.getCost(); } }
๋ฐ์ฝ”๋ ˆ์ดํ„ฐ 2๊ฐœ: ๋ฒ„์„ฏ๊ณผ ํŽ˜ํผ๋กœ๋‹ˆ
public class Mushroom extends PizzaDecorator { public Mushroom(Pizza newPizza) { super(newPizza); } @Override public String bakePizza() { return super.bakePizza() + " with Mushroom Topings"; } @Override public float getCost() { return super.getCost()+80; } } public class Pepperoni extends PizzaDecorator { public Pepperoni(Pizza newPizza) { super(newPizza); } @Override public String bakePizza() { return super.bakePizza() + " with Pepperoni Toppings"; } @Override public float getCost() { return super.getCost()+110; } }
์ˆ˜์—… ํ…Œ์ŠคํŠธ:
public class PizzaDecoratorTest { @Test public void shouldMakePepperoniPizza(){ Pizza pizza = new Pepperoni(new BasePizza()); assertEquals("Basic Pizza with Pepperoni Toppings",pizza.bakePizza()); assertEquals(210.0,pizza.getCost(),0); } }

์ฐจ์ด์ 

Builder ๋ฐ Factory(๋ฐ Abstract Factory)์™€ ๊ฐ™์€ ํŒจํ„ด์€ ์ƒˆ ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Decorator(๊ตฌ์กฐ์  ๋””์ž์ธ ํŒจํ„ด์ด๋ผ๊ณ ๋„ ํ•จ)์™€ ๊ฐ™์€ ํŒจํ„ด์€ ํ™•์žฅ์„ฑ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ ์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ฐœ์ฒด์— ๊ตฌ์กฐ์  ๋ณ€๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ํŒจํ„ด ๋ชจ๋‘ ์ฃผ๋กœ ์ƒ์†์„ ํ†ตํ•ด ๊ตฌ์„ฑ์„ ์ด‰์ง„ํ•˜๋ฉฐ, ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋Œ€์‹  ๋นŒ๋”๋ฅผ ์‚ฌ์šฉํ•  ๋งŒํผ ์ฐจ์ด์ ์ด ํฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์‹คํ–‰ํ•  ๋•Œ ์ƒ์†๋ฐ›์ง€ ์•Š๊ณ  ์ž์ฒด ๋™์ž‘์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๋นŒ๋”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค - ํŠน์ • ์†์„ฑ/๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ๊ฐ์ฒด ์ƒ์„ฑ์„ ์ œํ•œํ•˜๋ ค๋Š” ๊ฒฝ์šฐ. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ „์— ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ์†์„ฑ์ด 4~5๊ฐœ ์žˆ๊ฑฐ๋‚˜ ํŠน์ • ์†์„ฑ์ด ์•„์ง ์„ค์ •๋  ๋•Œ๊นŒ์ง€ ๊ฐ์ฒด ์ƒ์„ฑ์„ ๋™๊ฒฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ Joshua Bloch๊ฐ€ Java: Effective Programming, 2nd ed์—์„œ ์“ด ๊ฒƒ์ฒ˜๋Ÿผ ์ƒ์„ฑ์ž ๋Œ€์‹  ์‚ฌ์šฉํ•˜์„ธ์š”. ๋นŒ๋”๋Š” ์ƒ์„ฑ๋œ ๊ฐ์ฒด์— ์žˆ์–ด์•ผ ํ•˜๋Š” ์†์„ฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ์†์„ฑ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ˆจ๊น๋‹ˆ๋‹ค. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ธฐ์กด ๊ฐ์ฒด์— ์ƒˆ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๋Š” ๋™์•ˆ ๊ฐœ์ฒด๋ฅผ ๊ณ ์ •ํ•˜๋Š” ๋ฐ์—๋Š” ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‘ ํ…œํ”Œ๋ฆฟ ๋ชจ๋‘ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉฐ ๋น„์Šทํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ์ฐจ์ด์ ์€ ์‚ฌ์šฉ์— ์žˆ์Šต๋‹ˆ๋‹ค.
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION