์๋
์น๊ตฌ! ์ค๋ ์ฐ๋ฆฌ๋ ๋์์ธ ํจํด์ ๊ณ์ ๊ณต๋ถํ ๊ฒ์
๋๋ค. ์ด๋ฒ ์์
์์๋ ๊ณต์ฅ์ ๋ํด ์ด์ผ๊ธฐํ ๊ฒ์
๋๋ค. ์ด ํจํด์ด ํด๊ฒฐํ๋ ๋ฌธ์ ์ ๋ํด ๋
ผ์ํ๊ณ ๊ณต์ฅ์ด ์ปคํผ์์ ์ฌ๋ ๋ฐ ์ด๋ป๊ฒ ๋์์ด ๋๋์ง ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋ํ ๊ณต์ฅ์ ๋ง๋๋ ๊ฐ๋จํ 5๋จ๊ณ๋ฅผ ์๋ ค๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ๊ฐ์ ํ์ฅ์ ์๊ณ ์ด ๊ฐ๋
์ ๋น ๋ฅด๊ฒ ์ดํดํ๋ ค๋ฉด ๋ค์ ์ฃผ์ ์ ๋ํด ์ ์๊ณ ์์ด์ผ ํฉ๋๋ค.
- ์๋ฐ์ ์์
- Java์์ ์ฐธ์กฐ ์ ํ์ ์ถ์ ๋ฐ ํ์ฅ
- ๋ค๋ฅธ ํด๋์ค์ ๊ฐ์ฒด ๊ฐ์ ์ํธ ์์ฉ.
๊ณต์ฅ์ด๋ ๋ฌด์์ ๋๊น?
ํฉํ ๋ฆฌ ๋์์ธ ํจํด์ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด ์์ฑ์ ์ ์ดํ ์ ์์ต๋๋ค. ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ ์์ฃผ ๊ฐ๋จํ์ง๋ ์์ง๋ง ์ง๋์น๊ฒ ๋ณต์กํ์ง๋ ์์ต๋๋ค. ์ฐ๋ฆฌ ๋ชจ๋๋new
์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฐ์ฐ์๊ฐ ํ์ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์๋ง๋ ์ฌ๊ธฐ์๋ ์ ์ดํ ๊ฒ์ด ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ฌ์ค์ด ์๋๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง์ ์์์ด ์๋ ํน์ ํด๋์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ํน์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ ์ด๋ ค์์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ํฉํ ๋ฆฌ ๋ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค์ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋๋ ๋์์ธ ํจํด์
๋๋ค. ์ถ์์ ์ธ ๊ฐ๋
์ ์ด๋ป์ต๋๊น? ์๋ ์๋ฅผ ๋ณด๋ฉด ๋ ๋ช
ํํ๊ณ ๊ตฌ์ฒด์ ์ผ๋ก ์ ์ ์์ต๋๋ค.
๋ค์ํ ์ข ๋ฅ์ ์ปคํผ๋ฅผ ์ค๋นํ์
์ปคํผ์์ ์๋ํํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๋ ํ๋ก๊ทธ๋จ์ ๋ค์ํ ์ข ๋ฅ์ ์ปคํผ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๊ฐ๋ฅด์ณ์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด ์๋ฉ๋ฆฌ์นด๋ ธ, ์นดํธ์น๋ ธ, ์์คํ๋ ์, ๋ผ๋ผ ๋ฑ ์ค๋นํ ์ปคํผ ์ ํ์ ๋ํ๋ด๋ ์ปคํผ ํด๋์ค์ ๋ช ๊ฐ์ง ํ์ ํด๋์ค๋ฅผ ๋ง๋ญ๋๋ค. ์ผ๋ฐ์ ์ธ ์ปคํผ ์์ ๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค.
public class Coffee {
public void grindCoffee(){
// Grind the coffee
}
public void makeCoffee(){
// Brew the coffee
}
public void pourIntoCup(){
// Pour into a cup
}
}
๋ค์์ผ๋ก ์์ ํด๋์ค๋ฅผ ๋ง๋ญ๋๋ค.
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
๊ณ ๊ฐ์ ๋ชจ๋ ์ข
๋ฅ์ ์ปคํผ๋ฅผ ์ฃผ๋ฌธํ ์ ์์ต๋๋ค. ๊ทธ๋ค์ ๋ช
๋ น์ ํ๋ก๊ทธ๋จ์ ์ ๋ฌ๋์ด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด String
. ๊ทธ๋ฌ๋ an์ด enum
์ด์ ๊ฐ์ฅ ์ ํฉํฉ๋๋ค. enum
์ฃผ๋ฌธํ ์ ์๋ ์ปคํผ ์ ํ์ ํด๋นํ๋ ์ด๊ฑฐํ ํ๋๋ฅผ ๋ง๋ค๊ณ ์ ์ํฉ๋๋ค.
public enum CoffeeType {
ESPRESSO,
AMERICANO,
CAFFE_LATTE,
CAPPUCCINO
}
์์ฒญ๋. ์ด์ ์ปคํผ์์ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
public class CoffeeShop {
public Coffee orderCoffee(CoffeeType type) {
Coffee coffee = null;
switch (type) {
case AMERICANO:
coffee = new Americano();
break;
case ESPRESSO:
coffee = new Espresso();
break;
case CAPPUCCINO:
coffee = new Cappucัino();
break;
case CAFFE_LATTE:
coffee = new CaffeLatte();
break;
}
coffee.grindCoffee();
coffee.makeCoffee();
coffee.pourIntoCup();
System.out.println("Here's your coffee! Thanks! Come again!");
return coffee;
}
}
์ด orderCoffee
๋ฐฉ๋ฒ์ ๋ ๋ถ๋ถ์ผ๋ก ๋๋ ์ ์์ต๋๋ค.
- ๋ฌธ ์์ ์ปคํผ์ ํน์ ์ธ์คํด์ค ์์ฑ
switch
. ์ด๊ฒ์ ํฉํ ๋ฆฌ๊ฐ ํ๋ ์ผ์ ํ๋ ๊ณณ์ ๋๋ค. ์กฐ๊ฑด์ ๋ฐ๋ผ ํน์ ์ ํ์ ์์ฑํฉ๋๋ค. - ์ค๋น โ ์ด๊ฒ์ ๊ฐ๊ณ , ์์กฐํ๊ณ , ์ปต์ ๋ถ๋ ๊ฒ์ ๋๋ค.
- ์ค๋น ์์ฒด์ ๊ด๋ จ๋ ๋จ๊ณ(๊ฐ๊ธฐ, ์์กฐ ๋ฐ ์ปต์ ๋ถ๊ธฐ)๋ ๋ณ๊ฒฝ๋์ง ์์ ์ํ๋ก ์ ์ง๋ฉ๋๋ค(์ ์ด๋ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ๋ฏฟ๊ณ ์์ต๋๋ค).
- ๊ทธ๋ฌ๋ ์ปคํผ์ ๊ตฌ์์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์๋ง๋ ์ฐ๋ฆฌ๋ ๋ชจ์นด๋ฅผ ๋ง๋ค๊ธฐ ์์ํ ๊ฒ์ ๋๋ค... ํ๋ผํธ... ๋ชจ์นด์น... ์ด์จ๋ , ์๋ก์ด ์ข ๋ฅ์ ์ปคํผ.
switch
. ๋ํ ์ฐ๋ฆฌ ์ปคํผ์์์ orderCoffee
๋ค์ํ ์ ํ์ ์ปคํผ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด ์ ์ผํ ์ฅ์๊ฐ ์๋ ์๋ ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฌ๋ฌ ๊ณณ์์ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ๋น์ ์ ์๋ง ๋ด๊ฐ ๋ฌด์์ ์ป๊ณ ์๋์ง ์ด๋ฏธ ์ดํดํ๊ณ ์์ ๊ฒ์
๋๋ค. ๋ฆฌํฉํ ๋ง์ด ํ์ํฉ๋๋ค. ๋ ๊ฐ์ง ์ด์ ๋ก ์ปคํผ ์์ฑ์ ๋ด๋นํ๋ ๋ธ๋ก์ ๋ณ๋์ ํด๋์ค๋ก ์ด๋ํฉ๋๋ค.
- ๋ค๋ฅธ ๊ณณ์์ ์ปคํผ ๋ง๋ค๊ธฐ ๋ ผ๋ฆฌ๋ฅผ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๊ตฌ์์ด ๋ณ๊ฒฝ๋๋ฉด ์ปคํผ๊ฐ ์์ฑ๋๋ ๋ชจ๋ ๊ณณ์์ ์ฝ๋๋ฅผ ํธ์งํ ํ์๊ฐ ์์ต๋๋ค. ํ ๊ณณ์์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ๊ณต์ฅ ์ค๋ฆฝ
์ด๋ฅผ ์ํด ์ปคํผ ํด๋์ค์ ํ์ ์ธ์คํด์ค ์์ฑ์ ๋ด๋นํ๋ ์ ํด๋์ค๋ฅผ ์์ฑํฉ๋๋ค.
public class SimpleCoffeeFactory {
public Coffee createCoffee(CoffeeType type) {
Coffee coffee = null;
switch (type) {
case AMERICANO:
coffee = new Americano();
break;
case ESPRESSO:
coffee = new Espresso();
break;
case CAPPUCCINO:
coffee = new Cappucino();
break;
case CAFFE_LATTE:
coffee = new CaffeLatte();
break;
}
return coffee;
}
}
์ถํํด์! ์ฐ๋ฆฌ๋ ๊ณต์ฅ ์ค๊ณ ํจํด์ ๊ฐ์ฅ ๋จ์ํ ํํ(๊ฑฐ์)๋ก ๊ตฌํํ์ต๋๋ค. ๋ฉ์๋๋ฅผ ์ ์ ์ผ๋ก ๋ง๋ค๋ฉด ๋ ๊ฐ๋จํ ์ ์์ต๋๋ค createCoffee
. ํ์ง๋ง ๊ทธ๋ฌ๋ฉด ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ด ์์ค๋ฉ๋๋ค.
SimpleCoffeeFactory
๋ฉ์๋๋ฅผ ์์ํ๊ณ ์ฌ์ ์ํ๋ ๊ธฐ๋ฅcreateCoffee
.- ํ์ํ ํฉํ ๋ฆฌ ๊ตฌํ์ ํด๋์ค์ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ.
์ปคํผ์์ ๊ณต์ฅ์ ๋ํ๋ค
ํฉํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ปคํผ์ ํด๋์ค๋ฅผ ๋ค์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
public class CoffeeShop {
private final SimpleCoffeeFactory coffeeFactory;
public CoffeeShop(SimpleCoffeeFactory coffeeFactory) {
this.coffeeFactory = coffeeFactory;
}
public Coffee orderCoffee(CoffeeType type) {
Coffee coffee = coffeeFactory.createCoffee(type);
coffee.grindCoffee();
coffee.makeCoffee();
coffee.pourIntoCup();
System.out.println("Here's your coffee! Thanks! Come again!");
return coffee;
}
}
ํ๋ฅญํ. ์ด์ ํฉํ ๋ฆฌ ๋์์ธ ํจํด์ ์ผ๋ฐ์ ์ธ ๊ตฌ์กฐ์ ๋ํ ๊ฐ๊ฒฐํ ์ค๋ช
์ ์ ๊ณตํ๊ฒ ์ต๋๋ค.
๋๋ง์ ๊ณต์ฅ์ ์ฌ๋ 5๋จ๊ณ
1๋จ๊ณ. ํ๋ก๊ทธ๋จ์๋ ์๋ ๋ค์ด์ด๊ทธ๋จ๊ณผ ๊ฐ์ด ์ฌ๋ฌ ํ์ ํญ๋ชฉ์ด ์๋ ํด๋์ค๊ฐ ์์ต๋๋ค. 2๋จ๊ณ . ๊ฐ ํ์ ํด๋์ค์ ๋ํ ํ๋๊ฐ ์๋ ๋ฅผ ๋ง๋ญ๋๋ค .enum
enum CatType {
LION,
TIGER,
FLUFFY
}
3๋จ๊ณ. ๊ณต์ฅ์ ์ง์ต๋๋ค. ๊ทธ๊ฒ์ ๋ถ๋ฅด์ญ์์ค CatFactory
. ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
class CatFactory {}
4๋จ๊ณ. ํฉํฐ๋ฆฌ์์ ์ธ์๋ฅผ createCat
์ฌ์ฉํ๋ ๋ฉ์๋๋ฅผ ๋ง๋ญ๋๋ค CatType
. ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
class CatFactory {
public Cat createCat(CatType type) {
}
}
5๋จ๊ณ. ๋ฉ์๋ ๋ณธ๋ฌธ์์ switch
enum ํ๋๋ฅผ ์ด๊ฑฐํ๊ณ ์ ๋ฌ๋ enum
๊ฐ์ ํด๋นํ๋ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๋ฌธ์ ์์ฑํฉ๋๋ค.
class CatFactory {
public Cat createCat(CatType type) {
Cat cat = null;
switch (type) {
case LION:
cat = new Fluffy();
break;
case TIGER:
cat = new Tiger();
break;
case FLUFFY:
cat = new Lion();
break;
}
return cat;
}
}
์ด์ ์ฌ์ฅ์ฒ๋ผ ๊ณต์ฅ์ ์ด์ํ ์ ์์ต๋๋ค. :)
GO TO FULL VERSION