๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿคท๐Ÿผ‍โ™€๏ธ Etc.../- ๊ธฐํƒ€

[๊ฐœ๋ฐœ์ž ์ฑ…์ฝ๊ธฐ] Java๋กœ ํ•ด์„ํ•œ GoF ์˜ Design Pattern (์ƒ์„ฑ - ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด)

by Wonit 2022. 2. 14.

ํ•ด๋‹น ๊ธ€์€ 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 ๋งŒ ์ƒ์„ฑํ•˜๊ธฐ ๋–„๋ฌธ์—

 

๋Œ“๊ธ€