๊ด€๋ฆฌ ๋ฉ”๋‰ด

Tech Log ๐Ÿ› ๏ธ

[๋””์ž์ธ ํŒจํ„ด] ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์ด๋ž€? ๋ณธ๋ฌธ

TIL

[๋””์ž์ธ ํŒจํ„ด] ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์ด๋ž€?

sehaan 2023. 6. 9. 05:04

์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์ด๋ž€?

 

๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค์˜ ์˜์กดํ•˜์ง€ ์•Š๊ณ ๋„ ์„œ๋กœ ์—ฐ๊ด€ ๋œ ๊ฐ์ฒด๋“ค์˜ ์กฐํ•ฉ์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ํŒจํ„ด์ด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ์–ด๋–ค GUI ํ™˜๊ฒฝ์—์„œ ํด๋ฆญ๊ณผ ์Šคํฌ๋กค ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž

 

์šด์˜์ฒด์ œ๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค (์œˆ๋„์šฐ , ๋งฅ , ๋ฆฌ๋ˆ…์Šค)

 

๊ทธ๋ฆฌ๊ณ  ์šด์˜์ฒด์ œ์˜ ์ข…๋ฅ˜์— ์ƒ๊ด€ ์—†์ด ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ์€ ๋™์ผํ•œ ์—ญํ• ์„ ํ•œ๋‹ค

 

์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋Š” ๋™์ผํ•œ OS์— ๋Œ€ํ•ด ์ผ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ค€๋‹ค.

 

 

 

์ถ”์ƒ ํŒฉํ† ๋ฆฌ์˜ ์š”์†Œ๋“ค์„ ๊ฐ๊ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.

 

AbstractFactory
- ์‹ค์ œ ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค์˜ ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค

- GUI๋กœ ์น˜๋ฉด ๋ชจ๋“  OS ๋ฒ„์ „์„ ๋‹ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.


ConcreteFactory
- ๊ตฌ์ฒด์ ์ธ ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค๋กœ AbstractFactory ํด๋ž˜์Šค์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•จ์œผ๋กœ์จ ๊ตฌ์ฒด์ ์ธ ์ œํ’ˆ์„ ์ƒ์„ฑํ•œ๋‹ค.

- GUI๋กœ ์น˜๋ฉด OS์— ๋งž๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค.


AbstractProduct
- ์ œํ’ˆ์˜ ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค

- GUI๋กœ ์น˜๋ฉด ๊ณตํ†ต ๊ธฐ๋Šฅ(์ถ”์ƒ์ ์œผ๋กœ)์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. 


ConcreteProduct
- ๊ตฌ์ฒด์ ์ธ ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค์—์„œ ์ƒ์„ฑ๋˜๋Š” ๊ตฌ์ฒด์ ์ธ ๊ธฐ๋Šฅ

- ์—ฌ๊ธฐ์„œ ๊ฐ๊ฐ์˜ OS์— ๋งž๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

 

์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์‚ฌ์šฉ์ž๋Š” GUI์— ์ ‘์†ํ•  ๋•Œ OS ์— ๋งž๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ตฌํ˜„ ์ฝ”๋“œ

์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์—๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

 

๋จผ์ € AbstractFactory ์™€ AbstractProduct ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž - ๊ธฐ๋Šฅ์€ ํด๋ฆญ๊ณผ ์Šคํฌ๋กค์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

 

GuiFac(AbstractFactory)

public interface GuiFactory {
    public Click runClick();
    public Scroll scroll();
}

 

Click(AbstractProduct)

public interface Click {
    public void click();
}

 

Scroll(AbstractProduct)

public interface Click {
    public void click();
}

 

๊ธฐ๋Šฅ ๋‘ ๊ฐœ๋ฅผ ์ธํ„ฐํŽ˜์ด์Šคํ™” ํ•จ์œผ๋กœ์จ ๊ฐ๊ฐ์˜ OS๋Š” ์ด ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌ์ฒดํ™”ํ•˜๋ฉด ๋œ๋‹ค.

 

๋งŒ์•ฝ ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ํ•˜์ž

 

LinuxClick(ConcreteProduct)

public class LinuxClick implements Click{
    @Override
    public void click() {
        System.out.println("๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.");
    }
}

 

LinuxScroll(ConcreteProduct)

public class LinuxScroll implements Scroll {
    @Override
    public void scroll() {
        System.out.println("๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ ์Šคํฌ๋กคํ•ฉ๋‹ˆ๋‹ค.");
    }
}

 

์ด๋ ‡๊ฒŒ ๋‘ ๊ฐ€์ง€์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

 

๊ฐ๊ฐ ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•ด๋†“์€ Click , Scroll ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์ฒดํ™”ํ•œ๋‹ค.

 

๊ตฌํ˜„๋œ ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋ ค๋ฉด ConcreteFactory ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

LinuxGuiFac(ConcreteFactory)

public class LinuxGuiFac implements GuiFactory {

    @Override
    public Click runClick() {
        return new LinuxClick();
    }

    @Override
    public Scroll scroll() {
        return new LinuxScroll();
    }
}

 

์ด์ œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋๋‚ฌ๋‹ค

 

๋ฉ”์ธ์—์„œ ๊ธฐ๋Šฅ์„ ์‹คํ–‰์‹œ์ผœ๋ณด์ž

 

public class main {
    public static void main(String[] args) {
        GuiFactory gui = new LinuxGuiFac();
        Click click = gui.runClick();
        Scroll scroll = gui.scroll();

        click.click();
        scroll.scroll();
    }
}

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด,

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฆฌ๋ˆ…์Šค์—์„œ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ ๊ฐ’์ด ๋‚˜์˜จ๋‹ค.

 

๋งŒ์•ฝ ๋ฆฌ๋ˆ…์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ํ™˜๊ฒฝ(์œˆ๋„์šฐ , ๋งฅ) ์—์„œ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์œ„์—์„œ ํ–ˆ๋˜ ๋ฐฉ์‹๊ณผ ๋™์ผํ•˜๊ฒŒ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

(๊ณผ์ •์ƒ๋žต)

 

public class main {
    public static void main(String[] args) {
        GuiFactory gui = new WindowGuiFac();
        Click click = gui.runClick();
        Scroll scroll = gui.scroll();

        click.click();
        scroll.scroll();
    }
}

์œˆ๋„์šฐ๋กœ ๊ตฌํ˜„ ํŒฉํ† ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ด์ฃผ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๊ตฌํ˜„ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ์—†์ด ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

์ฐธ๊ณ ํ•œ ์‚ฌ์ดํŠธ

https://www.youtube.com/watch?v=soV1C6j9kkg 

https://gmlwjd9405.github.io/2018/08/08/abstract-factory-pattern.html

 

[Design Pattern] ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์ด๋ž€ - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io