ํด๋น ๊ธ์ Gang of Four์ ๋์์ธ ํจํด ์ด๋ผ๋ ์ฑ ์ ์ฝ๊ณ ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌ ๋ฐ ํ๊ณ ํ๋ ๊ธ ์ ๋๋ค. ์์ธํ ์ฌํญ์ YES 24 GoF์ ๋์์ธ ํจํด ์์ ํ์ธํด์ฃผ์ธ์.
GoF ์ ๋์์ธ ํจํด - ์ฌ์ฌ์ฉ์ฑ์ ์ง๋ ๊ฐ์ฒด์งํฅ ์ํํธ์จ์ด์ ํต์ฌ ์์
- ํ๋กํ ๋ฏธ๋์ด
- ์ง์์ด: ์๋ฆญ ๊ฐ๋ง, ์กด ๋ธ๋ฆฌ์ฌ์ด๋์ค, ๋ฆฌ์ฒ๋ ํฌ๋ฆ, ๋ํ ์กด์จ
- ์ฎ๊ธด์ด: ๊น์ ์
- ๋ค์ ๊ธ์ ํจ๊ป ์ฝ์ผ๋ฉด ์ข์ต๋๋ค.
Abstract Factory, ์ถ์ ํฉํ ๋ฆฌ ํจํด
Abstract Factory, ์ถ์ ํฉํ ๋ฆฌ ํจํด์ ๊ฐ์ฒด์ ์งํฉ์ ์์ฑํด์ผ ํ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ ํจํด์ด๋ค. ์๋ก ๊ด๋ จ์ด ์๊ฑฐ๋ ๋ ๋ฆฝ์ ์ธ ์ฌ๋ฌ ๊ฐ์ฒด์ ๊ตฐ์ ์์ฑํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค
๋๊ธฐ
- ์๋ก ๋ค๋ฅธ ๋ฃฉ์คํ์ ์๋ก ๋ค๋ฅธ UI์ ํํ ๋ฐฉ์๊ณผ ํ๋์ ๊ฐ๋๋ค.
- Java Swing ์์๋ MS ์ mac ๊ณผ ๊ฐ์ Host Machine ์ ๋ฐ๋ผ Look and Feel ์ด ๋ณ๊ฒฝ๋๋ค. ์ด์ ๋ฐ๋ผ ์ถ์ ํฉํ ๋ฆฌ์ ์๋ ๊ธฐ๋ณธ ํฉํ ๋ฆฌ ์์ฒด๊ฐ ๋ณ๊ฒฝ๋๋ค.
๊ตฌํ
์ฐธ์ฌ ๊ฐ์ฒด
- AbstractFactory
AbstractGUIFactory
- ConcreteFactory
WindowGUIFactory
OsxGUIFactory
- Product
Button
Menu
- ConcreteProduct
WindowButton
WindowMenu
OsxButton
OsxMenu
Factory Class
public interface AbstractGUIFactory {
Button createButton();
Menu createMenu();
}
public class OsxGUIFactory implements AbstractGUIFactory {
@Override
public Button createButton() {
return new OsxButton();
}
@Override
public Menu createMenu() {
return new OsxMenu();
}
}
public class WindowGUIFactory implements AbstractGUIFactory {
@Override
public Button createButton() {
return new WindowButton();
}
@Override
public Menu createMenu() {
return new WindowMenu();
}
}
์์ ๊ฐ์ด AbstractFactory ์์ ์ ํ ๊ตฐ์ ๋ง๋ Factory ๋ฅผ ์ถ์ํํ๊ณ ๊ฐ๊ฐ์ ๊ตฌํ์ ํ์ ํด๋์ค์ ์์ํ์ฌ ํ์ ํด๋์ค๊ฐ ๋ณธ์ธ์๊ฒ ๋ง๋ ์ ํ๋ค์ ์์ฑํ๋ ์ฑ ์์ ๊ฐ๋๋ก ํ๋ค.
Product Class
public interface Button {
void paint();
}
public interface Menu {
void onClick();
}
public class OsxButton implements Button {
@Override
public void paint() {
System.out.println("Mac OS ์ ๋ฒํผ์ด ํด๋ฆญ๋์์ต๋๋ค.");
}
}
public class OsxMenu implements Menu {
@Override
public void onClick() {
System.out.println("Osx ์ ๋ฉ๋ด๊ฐ ํด๋ฆญ๋์์ต๋๋ค.");
}
}
public class WindowButton implements Button {
@Override
public void paint() {
System.out.println("Window ์ ๋ฒํผ์ด ํด๋ฆญ๋์์ต๋๋ค.");
}
}
public class WindowMenu implements Menu {
@Override
public void onClick() {
System.out.println("Window ์ ๋ฉ๋ด๊ฐ ํด๋ฆญ๋์์ต๋๋ค.");
}
}
Product Class ์์๋ ๊ฐ๊ฐ์ ์ ํ๊ตฐ์ ํน์ฑ์ ๋ง๊ฒ ํ์ ๊ตฌํ์ด ๋์ด์์ผ๋ฉฐ ๊ณตํต๋ Interface ๋ฅผ ํตํด ๋คํ์ฑ์ ์ ์งํ๋ค.
Client
public class Application {
private AbstractGUIFactory factory;
@Setter
@Getter
private Button button;
@Setter
@Getter
private Menu menu;
public Application(AbstractGUIFactory factory) {
this.button = factory.createButton();
this.menu = factory.createMenu();
}
}
public class Client {
public static void main(String[] args) {
String type = "OSX";
AbstractGUIFactory factory; // ํด๋น Factory ์ Type ๋ง ์๋ฉด ํน์ Type ์ Product ๋ฅผ ์ ์ ์๋ค.
if ("OSX".equals(type)) {
factory = new OsxGUIFactory();
} else if ("WINDOWS".equals(type)) {
factory = new WindowGUIFactory();
} else {
throw new IllegalArgumentException();
}
Application application = new Application(factory);
Button button = application.getButton();
Menu menu = application.getMenu();
}
}
์์ Client ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด ํน์ Factory ์ Type ๋ง ์๊ฒ ๋๋ฉด ํด๋นํ๋ Type ์ Product ๋ผ๋ฆฌ์ ๊ฐ์ฒด ์์ฑ์ด ๊ฐ๋ฅํด์ง๋ค.
์์ ์ฝ๋๋ฅผ ํตํด ์ ์ ์๋ ์ฌ์ค์ ๊ตฌํ๊ณผ ์์ฑ์ ์ฑ ์์ ๋ถ๋ฆฌํ์์ ์ ์ ์์ผ๋ฉฐ ํน์ ํ Product ๊ฐ ์ถ๊ฐ๋๋ค ํ๋๋ผ๋ ๊ธฐ์กด์ ์ฝ๋์ ์ํฅ์ ์ต์ํ์ผ๋ก ์ ์งํ ์ ์๊ฒ ๋๋ค.
์ฅ์ ๊ณผ ๋จ์
์ฅ์
- factory ๋ก ๋ถํฐ ์์ฑ๋๋ product ๊ฐ ๊ฐ๊ฐ ๋์ผํ ์งํฉ์ ์ํ ์ ํ ๊ตฐ์ด๋ผ๋ ๊ฒ์ ํ์คํ ํ ์ ์๋ค.
- ๊ตฌ์ฒด product ์ ํด๋ผ์ด์ธํธ ์ฝ๋ ์ฌ์ด์ ๊ฒฐํฉ์ ํผํ ์ ์๋ค.
- ๊ฐ์ฒด์ ์์ฑ์ ํ ๊ณณ์์ ๋ด๋นํ๋ฏ๋ก SRP ์ ์๋ฐํ์ง ์๋๋ค.
- OCP ์์น์ ์๋ฐํ์ง ์๋ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์๋ค.
๋จ์
- Abstract Factory (Kit) ๋ก ์ธํด์ ์๋ก์ด ์ธํฐํ์ด์ค์ ํด๋์ค๊ฐ ๋์ ๋๋ฏ๋ก ์ฝ๋๋ ํ์ ์ด์์ผ๋ก ๋ณต์กํด์ง ์ ์๋ค.
์ ๋ฆฌ
- ์ถ์ ํฉํ ๋ฆฌ๋ ํฉํ ๋ฆฌ์ ์ ํ์ด ์ฐธ์ฌํ๋ค.
- ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ง์ ๋ง๋ค์ง ์๊ณ ์๋ ๊ด๋ จ๋ ์ ํ ๊ฐ์ฒด์ ๊ตฐ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ค.
- ์ถ์ ํฉํ ๋ฆฌ์์๋ ์ ํ์ ๊ฐ์ฒด ์ข
๋ฅ๋ ์ผ์ ํ๊ณ , ๊ฐ ๊ฐ์ฒด์ ํน์ฑ์ด ์ ํ๊ตฐ๋ง๋ค ์ฐจ์ด๊ฐ ์์ ๋ ๋งค์ฐ ์ข์ ๋ฐฉ๋ฒ์ด๋ค.
- ์ด๋ค ํน์ ํฉํ ๋ฆฌ๋ฅผ ์์ฑํด์ ํด๋น ํฉํ ๋ฆฌ๊ฐ ํ์ ์ ํ๋ค์ ์์ฑํด๋ด๋ ํํ์ด๋ค.
- ์ถ์ ํฉํ ๋ฆฌ๋ ์ ํ ๊ตฐ์ ์์ฑํ๋ค๋ ์ ์์ ๋ค๋ฅธ ์์ฑ ํจํด๊ณผ ๋ค๋ฅธ ์์์ ๋๋ค.
- ๋ค๋ฅธ ํจํด์ ํ ์ข ๋ฅ์ Product ๋ง ์์ฑํ๊ธฐ ๋๋ฌธ์
๋๊ธ