Notice
Recent Posts
Recent Comments
Link
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- fanout on read
- ํญํดํ๋ฌ์คํ๊ธฐ
- OOP
- fanout on write
- TDD
- ์ฑ๊ธํค ๋น
- ๋น ์ค์ฝํ
- ํญํด
- ํ๋กํ ํ์ ๋น
- ํญํ ํ๊ธฐ
- ํญํ
- ํญํด ๋ฐฑ์๋
- ํญํ ๋ฐฑ์๋
- ํญํด+
- ํญํดํ๋ฌ์ค๋ฐฑ์๋
- ๋ฐ์ดํฐ ์ฟผ๋ฆฌ
- pull model
- ์์ฑ ํจํด
- ํญํดํ๋ฌ์ค ํ๊ธฐ
- ํญํดํ๋ฌ์ค
- ๊ธฐ๋ฅ ํ ์คํธ
- ํญํดํ๋ฌ์ค ๋ฐฑ์๋
- ๋์์ธ ํจํด
- API Aggregation
- ํญํด ํ๋ฌ์ค ํ๊ธฐ
- ํญํด ํ๊ธฐ
- ์์ฐจ์งํฅ
- push model
- ํผ๋ ๊ตฌํ
- ํญํดํ๋ฌ์ค ํ๊ณ
Archives
- Today
- Total
deVlog
[๋์์ธ ํจํด] ์์ฑํจํด - Factory Method Pattern (ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด) ๋ณธ๋ฌธ
๐ ๏ธ Software Architecture/Design Pattern
[๋์์ธ ํจํด] ์์ฑํจํด - Factory Method Pattern (ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด)
์๋ฃจ๋ฐ 2024. 12. 4. 12:55๋ชฉ์ฐจ
๐ ๊ฐ์
Factory ํจํด์ ๊ฐ์ฒด ์์ฑ๊ณผ ๊ด๋ จ๋ ๋์์ธ ํจํด์ด๋ค.
Simple Factory ํจํด์ ๊ฐ์ฒด ์์ฑ ์ญํ ์ ๋ด๋นํ๋ฉด์ ๊ฐ ํด๋ผ์ด์ธํธ์์ ๊ตฌํ ํด๋์ค์ ์ง์ ์์กดํ์ง ์๋๋ก ๋ถ๋ฆฌํ๋ค.
ํ์ง๋ง "์๋ก์ด ํด๋์ค๊ฐ ์ถ๊ฐ๋์์ ๋ Factory ํด๋์ค๋ฅผ ์์ ํด์ผ ํ๋ค"๋ ํ๊ณ๊ฐ ์๋ค.
๊ธฐ์กด ์ฝ๋์ ๋ณ๊ฒฝ ์์ด ํ์ฅํ๊ธฐ ์ํ ๋์์ธ ํจํด์ด ๋ฐ๋ก Factory Method ํจํด์ด๋ค.
- ์์ฑ ํจํด ์ค ํ๋๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์ด๋ค ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ง ์๋ธ ํด๋์ค์์ ๊ฒฐ์ ํ๋ค.
- ์ฆ, ์ธ์คํด์ค ์์ฑ์ ์๋ธ ํด๋์ค์๊ฒ ์์ํ๋ค.
- ๋ถ๋ชจ ์ถ์ ํด๋์ค๋ ์ธํฐํ์ด์ค์๋ง ์์กดํ๊ณ ์ค์ ๋ก ์ด๋ค ๊ตฌํ ํด๋์ค๋ฅผ ํธ์ถํ ์ง๋ ์๋ธ ํด๋์ค์์ ๊ตฌํํ๋ค.
- ์๋ก์ด ๊ตฌํ ํด๋์ค๊ฐ ์ถ๊ฐ๋์ด๋ ๊ธฐ์กด Factory ์ฝ๋์ ์์ ์์ด ์๋ก์ด Factory ๋ฅผ ์ถ๊ฐํ๋ฉด ๋๋ค๋ ์ฅ์ ์ด ์๋ค.
๐ฉ๐ป๐ป ์ฝ๋๋ก ์์๋ณด์
// ํฌ๋ฆฌ์์ดํฐ ํด๋์ค๋ ์ ํ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ฐํํด์ผ ํ๋ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ ์ธํฉ๋๋ค.
abstract class Dialog {
// ํฉํ ๋ฆฌ ๋ฉ์๋ (์์ ํด๋์ค๊ฐ ์ค๋ฒ๋ผ์ด๋ ํด์ผ ํจ)
abstract Button createButton();
// ํฉํ ๋ฆฌ ๋ฉ์๋์์ ๋ฐํ๋ ์ ํ ๊ฐ์ฒด์ ์์กดํ๋ ๋น์ฆ๋์ค ๋ก์ง
public void render() {
// ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ ํ ๊ฐ์ฒด๋ฅผ ์์ฑ
Button okButton = createButton();
// ์์ฑ๋ ์ ํ์ ์ฌ์ฉ
okButton.onClick(() -> System.out.println("Dialog closed"));
okButton.render();
}
}
// ๊ตฌ์ ํฌ๋ฆฌ์์ดํฐ: WindowsDialog
class WindowsDialog extends Dialog {
@Override
Button createButton() {
return new WindowsButton();
}
}
// ๊ตฌ์ ํฌ๋ฆฌ์์ดํฐ: WebDialog
class WebDialog extends Dialog {
@Override
Button createButton() {
return new HTMLButton();
}
}
// ์ ํ ์ธํฐํ์ด์ค: Button
interface Button {
void render(); // ๋ฒํผ์ ๋ ๋๋ง
void onClick(Runnable action); // ํด๋ฆญ ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ค์
}
// ๊ตฌ์ ์ ํ: WindowsButton
class WindowsButton implements Button {
@Override
public void render() {
System.out.println("Rendering a Windows-style button.");
}
@Override
public void onClick(Runnable action) {
System.out.println("Binding a native OS click event.");
action.run();
}
}
// ๊ตฌ์ ์ ํ: HTMLButton
class HTMLButton implements Button {
@Override
public void render() {
System.out.println("Rendering an HTML button.");
}
@Override
public void onClick(Runnable action) {
System.out.println("Binding a web browser click event.");
action.run();
}
}
// ์ ํ๋ฆฌ์ผ์ด์
ํด๋์ค
class Application {
private Dialog dialog;
// ํ์ฌ ์ค์ ๋๋ ํ๊ฒฝ ์ค์ ์ ๋ฐ๋ผ ํฌ๋ฆฌ์์ดํฐ์ ์ ํ์ ์ ํ
public void initialize() {
String configOS = readApplicationConfigFile();
if ("Windows".equalsIgnoreCase(configOS)) {
dialog = new WindowsDialog();
} else if ("Web".equalsIgnoreCase(configOS)) {
dialog = new WebDialog();
} else {
throw new RuntimeException("Error! Unknown operating system.");
}
}
// ์ ํ๋ฆฌ์ผ์ด์
์ ์ง์
์
public void main() {
initialize();
dialog.render();
}
// ์ ํ๋ฆฌ์ผ์ด์
ํ๊ฒฝ์ค์ ์ ์ฝ์ด์ค๋ ๋ฉ์๋ (์์์ฉ)
private String readApplicationConfigFile() {
// ์ค์ ํ๊ฒฝ์ค์ ์ ์ฝ๋ ๋ก์ง์ด ๋ค์ด๊ฐ์ผ ํจ
// ์ฌ๊ธฐ์๋ ์์๋ก Windows ๋ฐํ
return "Windows";
}
public static void main(String[] args) {
Application app = new Application();
app.main();
}
}
โ๏ธ ์ฅ/๋จ์
์ฅ์
- ํฌ๋ฆฌ์์ดํฐ์ ๊ตฌ์ ์ ํ๋ค์ด ๋จ๋จํ๊ฒ ๊ฒฐํฉ๋์ง ์๋๋ก ํ ์ ์๋ค. (์ ํ ์ธํฐํ์ด์ค์ ์์กดํ๊ธฐ ๋๋ฌธ)
- ๋จ์ผ ์ฑ ์ ์์น(SRP) : ์ ํ ์์ฑ ์ฝ๋๋ฅผ ํ๋ก๊ทธ๋จ์ ํ ์์น๋ก ์ด๋ํ์ฌ ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ ์ง๊ด๋ฆฌํ ์ ์๋ค.
- ๊ฐ๋ฐฉ/ํ์ ์์น(OCP) : ๊ธฐ์กด ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ํผ์ํ์ง ์๊ณ ์๋ก์ด ์ ํ์ ์ ํ๋ค์ ํ๋ก๊ทธ๋จ์ ๋์ ํ ์ ์๋ค.
๋จ์
- ํจํด์ ๊ตฌํํ๊ธฐ ์ํด ๋ง์ ์๋ก์ด ์์ ํด๋์ค๋ค์ ๋์ ํด์ผ ํ๋ฏ๋ก ์ฝ๋๊ฐ ๋ ๋ณต์กํด์ง ์ ์๋ค.
๐ ๋ค๋ฅธ ํจํด๊ณผ์ ๊ด๊ณ
- ๋ง์ ๋์์ธ์ ๋ณต์ก์ฑ์ด ๋ฎ๊ณ ์์ ํด๋์ค๋ค์ ํตํด ๋ ๋ง์ ์ปค์คํฐ๋ง์ด์ง์ด ๊ฐ๋ฅํ ํฉํ ๋ฆฌ ๋ฉ์๋๋ก ์์ํด ๋ ์ ์ฐํ๋ฉด์๋ ๋ ๋ณต์กํ ์ถ์ ํฉํ ๋ฆฌ, ํ๋กํ ํ์ ๋๋ ๋น๋ ํจํด์ผ๋ก ๋ฐ์ ๋๋ค.
- ์ถ์ ํฉํ ๋ฆฌ ํด๋์ค๋ค์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ค์ ์งํฉ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๋ํ, ํ๋กํ ํ์ ์ ์ฌ์ฉํ์ฌ ์ถ์ ํฉํ ๋ฆฌ์ ๊ตฌ์ ํด๋์ค๋ค์ ์์ฑ ๋ฉ์๋๋ค์ ๊ตฌํํ ์ ์๋ค.
- ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ๋ฐ๋ณต์์ ํจ๊ป ์ฌ์ฉํ์ฌ ์ปฌ๋ ์ ์์ ํด๋์ค๋ค์ด ํด๋น ์ปฌ๋ ์ ๋ค๊ณผ ํธํ๋๋ ๋ค์ํ ์ ํ์ ๋ฐ๋ณต์๋ค์ ๋ฐํํ๋๋ก ํ ์ ์๋ค.
- ํฉํ ๋ฆฌ ๋ฉ์๋๋ ํ ํ๋ฆฟ ๋ฉ์๋์ ํน์ํ๋ผ๊ณ ์๊ฐํ ์ ์๋ค. ๋์์ ๋๊ท๋ชจ ํ ํ๋ฆฟ ๋ฉ์๋์ ํ ๋จ๊ณ์ ์ญํ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ ํ ์ ์๋ค.
๐ ์ฐธ๊ณ