๐พ [CS] ํฉํ ๋ฆฌ ํจํด(factory pattern).
1๏ธโฃ ํฉํ ๋ฆฌ ํจํด(factory pattern).
-
ํฉํ ๋ฆฌ ํจํด(factory pattern)์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋์์ ๊ฐ์ฒด ์์ฑ ๋ถ๋ถ์ ๋ผ์ด๋ด ์ถ์ํํ ํจํด์ด์ ์์ ๊ด๊ณ์ ์๋ ๋ ํด๋์ค์์ ์์ ํด๋์ค๊ฐ ์ค์ํ ๋ผ๋๋ฅผ ๊ฒฐ์ ํ๊ณ , ํ์ ํด๋์ค์์ ๊ฐ์ฒด ์์ฑ์ ๊ดํ ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ ๊ฒฐ์ ํ๋ ํจํด์ ๋๋ค.
-
์์ ํด๋์ค์ ํ์ ํด๋์ค๊ฐ ๋ถ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ๋์จํ ๊ฒฐํฉ์ ๊ฐ์ง๋ฉฐ ์์ ํด๋์ค์์๋ ์ธ์คํด์ค ์์ฑ ๋ฐฉ์์ ๋ํด ์ ํ ์ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ ๋ง์ ์ ์ฐ์ฑ์ ๊ฐ๊ฒ ๋ฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฒด ์์ฑ ๋ก์ง์ด ๋ฐ๋ก ๋ผ์ด์ ธ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋งํ๋๋ผ๋ ํ ๊ณณ๋ง ๊ณ ์น ์ ์๊ฒ ๋๋ ์ ์ง ๋ณด์์ฑ์ด ์ฆ๊ฐ๋ฉ๋๋ค.
- ์๋ฅผ ๋ค์ด ๋ผ๋ผ ๋ ์ํผ์ ์๋ฉ๋ฆฌ์นด๋ ธ ๋ ์ํผ, ์ฐ์ ๋ ์ํผ๋ผ๋ ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ด ๋ค์ด ์๋ ํ์ ํด๋์ค๊ฐ ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๋ฅผ ํตํด ์ ๋ฌ๋๊ณ , ์์ ํด๋์ค์ธ ๋ฐ๋ฆฌ์คํ ๊ณต์ฅ์์ ์ด ๋ ์ํผ๋ค์ ํ ๋๋ก ์ฐ์ ๋ฑ์ ์์ฐํ๋ ์์ฐ ๊ณต์ ์ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฒด ์์ฑ ๋ก์ง์ด ๋ฐ๋ก ๋ผ์ด์ ธ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋งํ๋๋ผ๋ ํ ๊ณณ๋ง ๊ณ ์น ์ ์๊ฒ ๋๋ ์ ์ง ๋ณด์์ฑ์ด ์ฆ๊ฐ๋ฉ๋๋ค.
2๏ธโฃ ์๋ฐ์ ํฉํ ๋ฆฌ ํจํด
enum CoffeeType {
LATTE,
ESPRESSO
}
abstract class Coffee {
protected String name;
public String getName() {
return name;
}
}
class Latte extends Coffee {
public Latte() {
name = "latte";
}
}
class Espresso extends Coffee {
public Espresso() {
name = "Espresso";
}
}
class CoffeeFactory {
public static Coffee createCoffee(CoffeeType type) {
switch (type) {
case LATTE:
return new Latte();
case ESPRESSO:
return new Espresso();
default:
throw new IllegalArgumentException("Invalid coffee type: " + type);
}
}
}
public class Main {
public static void main(String[] args) {
Coffee coffee = CoffeeFactory.createCoffee(CoffeeType.LATTE);
System.out.println(coffee.getName()); // latte
}
}
3๏ธโฃ ์ฝ๋ ์ค๋ช .
-
ํฉํ ๋ฆฌ ํจํด(Factory Pattern) ์ ๊ฐ์ฒด ์์ฑ์ ๋ก์ง์ ๋ณ๋์ ํด๋์ค๋ ๋ฉ์๋๋ก ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ๋ ๋์์ธ ํจํด์
๋๋ค.
- ์ด๋ ๊ฐ์ฒด ์์ฑ์ ๊ด๋ จ๋ ์ฝ๋๋ฅผ ํด๋ผ์ด์ธํธ ์ฝ๋์์ ๋ถ๋ฆฌํ์ฌ, ๊ฐ์ฒด ์์ฑ์ ๋ณํ์ ๋ํ ์ ์ฐ์ฑ์ ๋์ด๊ณ ์ฝ๋์ ์ ์ง๋ณด์์ฑ์ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ํฉํ ๋ฆฌ ํจํด ์ ํฌ๊ฒ ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด ๊ณผ ์ถ์ ํฉํ ๋ฆฌ ํจํด ์ผ๋ก ๊ตฌ๋ถ๋๋ฉฐ, ์ ์ฝ๋ ์์๋ ํฉํ ๋ฆฌ ๋ฉ์ค๋ ํจํด ์ ์ ํ์ ์ธ ์์ ๋๋ค.
1. CoffeeType
์ด๊ฑฐํ(Enum)
enum CoffeeType {
LATTE,
ESPRESSO
}
-
์ค๋ช
:
CoffeeType
์ ์ปคํผ์ ์ข ๋ฅ๋ฅผ ๋ํ๋ด๋ ์ด๊ฑฐํ(Enum)์ ๋๋ค.- ์ด ์ด๊ฑฐํ์
LATTE
์ESPRESSO
๋ ๊ฐ์ง ํ์ ์ ์ปคํผ๋ฅผ ์ ์ํ๊ณ ์์ต๋๋ค.
- ์ด ์ด๊ฑฐํ์
-
์ญํ : ์ปคํผ์ ์ข
๋ฅ๋ฅผ ์ฝ๋ ๋ด์์ ๋ช
ํํ๊ฒ ๊ตฌ๋ถํ๊ณ ,
CoffeeFactory
์์ ์ปคํผ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
2. Coffee
์ถ์ ํด๋์ค.
abstract class Coffee {
protected String name;
public String getName() {
return name;
}
}
-
์ค๋ช
:
Coffee
๋ ์ปคํผ ๊ฐ์ฒด์ ๊ณตํต๋ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์ ์ํ ์ถ์ ํด๋์ค์ ๋๋ค.-
name
ํ๋๋ ์ปคํผ์ ์ด๋ฆ์ ์ ์ฅํ๋ฉฐ,getName()
๋ฉ์๋๋ ์ปคํผ์ ์ด๋ฆ์ ๋ฐํํฉ๋๋ค.
-
- ์ญํ : ๊ตฌ์ฒด์ ์ธ ์ปคํผ ํด๋์ค๋ค์ด ์์๋ฐ์์ผ ํ๋ ๊ณตํต์ ์ธ ๊ธฐ๋ฅ์ ์ ์ํฉ๋๋ค.
3. Latte
์ Espresso
ํด๋์ค.
class Latte extends Coffee {
public Latte() {
name = "latte";
}
}
class Espresso extends Coffee {
public Espresso() {
name = "Espresso";
}
}
-
์ค๋ช
:
Latte
์Espresso
๋Coffee
ํด๋์ค๋ฅผ ์์๋ฐ์ ๊ตฌ์ฒด์ ์ธ ์ปคํผ ํ์ ์ ๊ตฌํํ ํด๋์ค๋ค์ ๋๋ค.- ๊ฐ ํด๋์ค๋ ์์ฑ์์์
name
ํ๋๋ฅผ ํน์ ์ปคํผ ์ด๋ฆ์ผ๋ก ์ด๊ธฐํํฉ๋๋ค.
- ๊ฐ ํด๋์ค๋ ์์ฑ์์์
- ์ญํ : ํน์ ์ปคํผ ํ์ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ญํ ์ ํฉ๋๋ค.
4. CoffeeFactory
ํด๋์ค.
class CoffeeFactory {
public static Coffee createCoffee(CoffeeType type) {
switch (type) {
case LATTE:
return new Latte();
case ESPRESSO:
return new Espresso();
default:
throw new IllegalArgumentException("Invalid coffee tyep: " + type);
}
}
}
-
์ค๋ช
: CoffeeFactory ํด๋์ค๋ ํฉํ ๋ฆฌ ํจํด์ ํต์ฌ์ผ๋ก,
createCoffee()
๋ฉ์๋๋ฅผ ํตํด ํน์ ํ์ ์ ์ปคํผ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋ฐํํฉ๋๋ค.-
CoffeeType
์ด๊ฑฐํ์ ๋ฐ๋ผ ์ ์ ํ ์ปคํผ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
-
-
์ญํ : ๊ฐ์ฒด ์์ฑ์ ๋ก์ง์ ์ค์ ์ง์คํํ์ฌ ํด๋ผ์ด์ธํธ ์ฝ๋์์ ๊ฐ์ฒด ์์ฑ์ ์ฑ
์์ ๋ถ๋ฆฌํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๋
CoffeeFactory
์createCoffee()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ํ๋ ์ปคํผ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ๋
5. Main
ํด๋์ค.
public class Main {
public static void main(String[] args) {
Coffee coffee = CoffeeFactory.createCoffee(CoffeeType.LATTE);
System.out.println(coffee.getName()); // latte
}
}
-
์ค๋ช
:
Main
ํด๋์ค๋ ํด๋ผ์ด์ธํธ ์ฝ๋๋ก,CoffeeFactory
๋ฅผ ์ฌ์ฉํ์ฌLATTE
ํ์ ์ ์ปคํผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ๊ทธ ์ด๋ฆ์ ์ถ๋ ฅํฉ๋๋ค. - ์ญํ : ํฉํ ๋ฆฌ ํจํด์ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ ์ฝ๋๋ก, ์ง์ ์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ ํฉํ ๋ฆฌ๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
4๏ธโฃ ํฉํ ๋ฆฌ ํจํด์ ์ฅ์ .
-
1. ์ฝ๋์ ์ ์ฐ์ฑ ์ฆ๊ฐ.
- ๊ฐ์ฒด ์์ฑ ๋ก์ง์ด ์ค์ํ๋์ด ์์ผ๋ฏ๋ก, ์๋ก์ด ์ปคํผ ํ์ ์ ์ถ๊ฐํ ๋ ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ์์ ํ ํ์ ์์ด ํฉํ ๋ฆฌ ํด๋์ค๋ง ์์ ํ๋ฉด ๋ฉ๋๋ค.
-
2. ์ ์ง๋ณด์์ฑ ํฅ์.
- ๊ฐ์ฒด ์์ฑ ์ฝ๋๊ฐ ํ ๊ณณ์ ๋ชจ์ฌ ์์ด ์ฝ๋์ ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๋๋ค.
- ๊ฐ์ฒด ์์ฑ ๊ณผ์ ์์์ ๋ณ๊ฒฝ์ด ํ์ํ ๊ฒฝ์ฐ์๋ ํฉํ ๋ฆฌ ํด๋์ค๋ง ์์ ํ๋ฉด ๋ฉ๋๋ค.
- ๊ฐ์ฒด ์์ฑ ์ฝ๋๊ฐ ํ ๊ณณ์ ๋ชจ์ฌ ์์ด ์ฝ๋์ ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๋๋ค.
-
3. ์ฝ๋์ ๊ฒฐํฉ๋ ๊ฐ์.
- ํด๋ผ์ด์ธํธ ์ฝ๋๋ ๊ตฌ์ฒด์ ์ธ ํด๋์ค์ ์์กดํ์ง ์๊ณ , ์ธํฐํ์ด์ค๋ ์ถ์ ํด๋์ค๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๋๋ค.
5๏ธโฃ ํฉํ ๋ฆฌ ํจํด์ ๋จ์ .
-
1. ํด๋์ค์ ๋ณต์ก์ฑ ์ฆ๊ฐ.
- ๊ฐ์ฒด ์์ฑ์ ์ํ ํฉํ ๋ฆฌ ํด๋์ค๊ฐ ์ถ๊ฐ๋จ์ผ๋ก์จ ํด๋์ค์ ์๊ฐ ์ฆ๊ฐํ๊ณ , ์ฝ๋ ๊ตฌ์กฐ๊ฐ ๋ค์ ๋ณต์กํด์ง ์ ์์ต๋๋ค.
-
2. ํ์ฅ ์ ์ฃผ์ ํ์.
- ์๋ก์ด ์ปคํผ ํ์
์ ์ถ๊ฐํ ๋๋ง๋ค ํฉํ ๋ฆฌ ํด๋์ค์
switch
๋ฌธ์ด๋if-else
๋ฌธ์ด ์ฆ๊ฐํ ์ ์์ด, ํ์ฅ์ฑ์ด ์ ํ๋ ์ ์์ต๋๋ค.- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ถ์ ํฉํ ๋ฆฌ ํจํด์ด๋ ๋ค๋ฅธ ๋์์ธ ํจํด๊ณผ ๊ฒฐํฉํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
- ์๋ก์ด ์ปคํผ ํ์
์ ์ถ๊ฐํ ๋๋ง๋ค ํฉํ ๋ฆฌ ํด๋์ค์
6๏ธโฃ ๊ฒฐ๋ก .
- ํฉํ ๋ฆฌ ํจํด์ ๊ฐ์ฒด ์์ฑ์ ์ฑ
์์ ๋ถ๋ฆฌํ์ฌ ์ฝ๋์ ์ ์ฐ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ด๋ ๊ฐ๋ ฅํ ๋์์ธ ํจํด์
๋๋ค.
- ์ ์ฝ๋ ์์์์๋ ์ปคํผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ก์ง์
CoffeeFactory
ํด๋์ค์ ๋ชจ์๋์ด, ํด๋ผ์ด์ธํธ ์ฝ๋๊ฐ ํน์ ์ปคํผ ํด๋์ค์ ์ง์ ์ ์ผ๋ก ์์กดํ์ง ์๋๋ก ํ์์ต๋๋ค.- ์ด๋ฅผ ํตํด ํด๋ผ์ด์ธํธ ์ฝ๋๋ ์ปคํผ ๊ฐ์ฒด์ ์์ฑ ๋ฐฉ์์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์๊ณ ๋ ๋ค์ํ ํ์ ์ ์ปคํผ๋ฅผ ์์ฑํ๊ณ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
- ์ ์ฝ๋ ์์์์๋ ์ปคํผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ก์ง์