ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด (Factory Method Pattern)
๊ฐ์ฒด ์์ฑ์ ์ฒ๋ฆฌํ๋ ํจํด์ผ๋ก, ๊ฐ์ฒด ์์ฑ์ ์๋ธํด๋์ค์ ์์ํ์ฌ ์ ์ฐ์ฑ์ ํ๋ณดํฉ๋๋ค. ๋ถ๋ชจ ํด๋์ค์์๋ ๊ฐ์ฒด ์์ฑ์ ๋ํ ๊ธฐ๋ณธ ๊ณจ๊ฒฉ์ ์ ๊ณตํ๊ณ , ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด ์์ฑ์ ์์ ํด๋์ค์์ ๋ด๋นํ์ฌ ๊ฐ์ฒด ์์ฑ์ ์บก์ํ๋ฅผ ์คํํฉ๋๋ค.
์ฃผ์ ๋ชฉ์
โข
๊ฐ์ฒด ์์ฑ ๋ก์ง์ ์บก์ํํ์ฌ ์ฝ๋์ ์ ์ฐ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ ํฅ์
โข
๊ฐ์ฒด ์์ฑ๊ณผ ์ฌ์ฉ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถค
โข
ํ์ฅ์๋ ์ด๋ ค์๊ณ ์์ ์๋ ๋ซํ์๋ OCP ์์น ์ค์
ํน์ง
โข
์์ฑํ ๊ฐ์ฒด์ ํด๋์ค๋ฅผ ์๋ธํด๋์ค์์ ๊ฒฐ์
โข
๊ฐ์ฒด ์์ฑ ์ธํฐํ์ด์ค๋ ์์ ํด๋์ค์์ ์ ์
โข
์ค์ ์์ฑ์ ํ์ ํด๋์ค์์ ๊ตฌํ
โข
๊ธฐ์กด ์ฝ๋ ์์ ์์ด ์๋ก์ด ๊ฐ์ฒด ํ์
์ถ๊ฐ ๊ฐ๋ฅ
์์ ์ฝ๋
// Creator
abstract class DialogCreator {
abstract Button createButton(); // ํฉํ ๋ฆฌ ๋ฉ์๋
void render() {
Button button = createButton();
button.render();
}
}
// Concrete Creator
class WindowsDialog extends DialogCreator {
@Override
Button createButton() {
return new WindowsButton();
}
}
// Product
interface Button {
void render();
}
// Concrete Product
class WindowsButton implements Button {
@Override
public void render() {
System.out.println("Windows ์คํ์ผ ๋ฒํผ");
}
}
Java
๋ณต์ฌ
์ฝ๋ ํด์ค
์ ์์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค:
โข
DialogCreator (Creator)
โฆ
์ถ์ ํด๋์ค๋ก, ๋ฒํผ ์์ฑ์ ์ํ ํฉํ ๋ฆฌ ๋ฉ์๋(createButton)๋ฅผ ์ ์ธ
โฆ
render() ๋ฉ์๋์์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒํผ์ ์์ฑํ๊ณ ๋ ๋๋ง
โข
WindowsDialog (Concrete Creator)
โฆ
DialogCreator๋ฅผ ์์๋ฐ์ ๊ตฌ์ฒด์ ์ธ ๋ฒํผ ์์ฑ ๋ก์ง์ ๊ตฌํ
โฆ
Windows ์คํ์ผ์ ๋ฒํผ์ ์์ฑํ๋ createButton() ๋ฉ์๋ ๊ตฌํ
โข
Button (Product)
โฆ
์์ฑ๋ ๋ฒํผ์ ์ธํฐํ์ด์ค๋ฅผ ์ ์
โฆ
render() ๋ฉ์๋๋ฅผ ์ ์ธํ์ฌ ๋ฒํผ ๋ ๋๋ง ๋์์ ๋ช
์
โข
WindowsButton (Concrete Product)
โฆ
Button ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ตฌ์ฒด์ ์ธ ๋ฒํผ ํด๋์ค
โฆ
Windows ์คํ์ผ์ ๋ง๋ ๋ฒํผ ๋ ๋๋ง ๋ก์ง ๊ตฌํ
์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ํตํด ์๋ก์ด ๋ฒํผ ์คํ์ผ(์: MacButton, LinuxButton ๋ฑ)์ ์ถ๊ฐํ ๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ์ฝ๊ฒ ํ์ฅ์ด ๊ฐ๋ฅํฉ๋๋ค.