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

Tech Log ๐Ÿ› ๏ธ

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

์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

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

sehaan 2023. 6. 29. 22:24

์ฃผ์š” ๋””์ž์ธ ํŒจํ„ด 13๊ฐ€์ง€

1. ์ƒ์„ฑ ํŒจํ„ด

- ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด

- ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด

- ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด

 

2. ํ–‰๋™ ํŒจํ„ด

- ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด

- ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด

- ์ƒํƒœ ํŒจํ„ด 

- ๋ฐ˜๋ณต์ž ํŒจํ„ด

- ์ „๋žต ํŒจํ„ด

- ์˜ต์ €๋ฒ„ ํŒจํ„ด

 

3. ๊ตฌ์กฐ ํŒจํ„ด

- ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด

- ํ”„๋ก์‹œ ํŒจํ„ด

- ์ปดํฌ์ง€ํŠธ ํŒจํ„ด

- ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด

- ํผ์‚ฌ๋“œ ํŒจํ„ด

 


 

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

- ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๊ตฌ์ƒ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฐ์ฒด๋“ค์˜ ์กฐํ•ฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด

- ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค๋Š” ์„œ๋กœ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฐ์ฒด๋“ค์˜ ์ง‘ํ•ฉ์ด๋‹ค.

 

*์„œ๋กœ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ด€๊ณ„์˜ ์˜ˆ์‹œ 

- ์ปดํ“จํ„ฐ ๋ธŒ๋žœ๋“œ : ์‚ผ์„ฑ , LG

- ์šด์˜์ฒด์ œ์— ๋”ฐ๋ฅธ GUI : ๋งฅ , ๋ฆฌ๋ˆ…์Šค , ์œˆ๋„์šฐ

 

์‚ผ์„ฑ ์ปดํ“จํ„ฐ ๋ธŒ๋žœ๋“œ ๊ณต์žฅ์—์„œ๋Š” ์‚ผ์„ฑ ์ปดํ“จํ„ฐ ๋ถ€ํ’ˆ์„ ์ฐ์–ด๋‚ด๊ณ ,

๋งฅ ํ™˜๊ฒฝ์—์„œ๋Š” ๋งฅ GUI์—์„œ ๋งฅ ํ™˜๊ฒฝ์—์„œ์˜ GUI๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

 

์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ ๋ธŒ๋žœ๋“œ , ์šด์˜์ฒด์ œ์˜ ์ข…๋ฅ˜์— ์ƒ๊ด€์—†์ด ๊ทธ๊ฒƒ์˜ ๊ธฐ๋Šฅ์€ ๋ชจ๋‘ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

ํ–ฅํ›„ ์ด "๊ธฐ๋Šฅ"์€ ์ถ”์ƒํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฌถ์–ด์ง„๋‹ค.

 

2. ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด?

 

๋จ„์•ฝ ์œˆ๋„์šฐ ํ™˜๊ฒฝ์—์„œ GUI ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž

 

ํด๋ฆญ๊ณผ ์Šคํฌ๋กค ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณผ๊ฒƒ์ด๋‹ค.

 

Click click = WinGui.runClick();
Scroll scroll = WinGui.runScroll();
// ์œˆ๋„์šฐ ํด๋ฆญ , ์Šคํฌ๋กค ๊ตฌํ˜„์ฒด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
click.click();
scroll.scroll();
// ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ ์‹คํ–‰

 

ํ•˜์ง€๋งŒ ์ด์ œ ์œˆ๋„์šฐ๊ฐ€ ์•„๋‹Œ ๋ฆฌ๋ˆ…์Šค ๊ธฐ๋Šฅ๊นŒ์ง€ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ?

 

Click click = LinuxGui.runClick();
Scroll scroll = LinuxGui.runScroll();
// ์œˆ๋„์šฐ ํด๋ฆญ , ์Šคํฌ๋กค ๊ตฌํ˜„์ฒด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
click.click();
scroll.scroll();
// ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ ์‹คํ–‰

 

์ด์ฒ˜๋Ÿผ ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ˆ˜์ •ํ•˜์—ฌ์„œ ์ฝ”๋“œ์— ๋ฐ˜์˜ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

 

์ฆ‰, ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌํ˜„ ์ฝ”๋“œ์— ์˜์กดํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ด๊ฒƒ์„ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ฐ”๊ฟ”๋ณผ๋ ค๊ณ  ํ•œ๋‹ค.

GuiFactory gui = new WinGuiFac();
Click click = gui.runClick();
Scroll scroll = gui.runScroll();    

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

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŒฉํ† ๋ฆฌ ๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ›์•„์„œ ํ•ด๋‹น ํŒฉํ† ๋ฆฌ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜์˜€๋‹ค.

 

๊ทธ๋Ÿผ ๋‹ค์‹œ ์œˆ๋„์šฐ ๊ธฐ๋Šฅ์„ ์“ฐ๋ ค๋ฉด?

 

GuiFactory gui = new WinGuiFac();
// ์—ฌ๊ธฐ๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋จ
Click click = gui.runClick();
Scroll scroll = gui.runScroll();    

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

 

ํŒฉํ† ๋ฆฌ ํ•˜๋‚˜๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค !

 

๊ธฐ์กด ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜์กดํ•˜๋˜ ๊ฒƒ์— ๋น„ํ•˜๋ฉด ํ›จ์”ฌ ๊ฐœ์„ ๋˜์—ˆ๋‹ค.

 

3. ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

 

์œ„์—์„œ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๊ฐ€ ์–ด๋–ค ๊ฒƒ์ด ๋Œ€๋žต ์•Œ์•˜๋‹ค๋ฉด , ์ด์ œ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„์„ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ ?

 

์ถœ์ฒ˜ : https://gmlwjd9405.github.io/2018/08/08/abstract-factory-pattern.html

 

๊ธฐ๋ณธ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

AbstractFactory : ๋ชจ๋“  ํŒฉํ† ๋ฆฌ ๊ตฌํ˜„์ฒด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค (ํ˜น์€ ์ถ”์ƒ ํด๋ž˜์Šค)์ด๋‹ค.

 

ConcreteFactory : AbstractFactory์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•จ์œผ๋กœ์จ ์ œํ’ˆ/๊ธฐ๋Šฅ์„ ์ƒ์‚ฐํ•œ๋‹ค.  

                              ์—ฌ๊ธฐ์„œ ์‚ผ์„ฑ/LG , ๋ฆฌ๋ˆ…์Šค/์œˆ๋„์šฐ ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ํƒ€์ž…์œผ๋กœ ๋‚˜๋‰จ

 

ConcreteProduct : ํŒฉํ† ๋ฆฌ์—์„œ ์ƒ์„ฑ๋˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ œํ’ˆ/๊ธฐ๋Šฅ์ด๋‹ค.

                               AbstractProduct๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•œ๋‹ค.

 

AbstractProduct : ConcereteProduct์˜ ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. 

 

๊ตฌ์ฒด์ ์ธ ์ฝ”๋“œ๋“ค์„ ์‚ดํŽด๋ณด์ž

 

AbstractFactory

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

ConcreteFactory 

public class WindowGuiFac implements GuiFactory {
    @Override
    public Click runClick() {
        return new WindowClick();
    }

    @Override
    public Scroll runScroll() {
        return new WindowScroll();
    }
}

 

AbstractProduct 

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

ConcreteProduct

public class WindowGuiFac implements GuiFactory {
    @Override
    public Click runClick() {
        return new WindowClick();
    }

    @Override
    public Scroll runScroll() {
        return new WindowScroll();
    }
}

 

๊ตฌํ˜„์€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋Š” 

 

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

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

์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•ด์ง„๋‹ค.

 

์š”์•ฝ์„ ํ•˜์ž๋ฉด

 

ํด๋ผ์ด์–ธํŠธ์—์„œ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ(Abstract Factory)์— ํŒฉํ† ๋ฆฌ(Concrete Factory) ์ฃผ์ž…

-> ํŒฉํ† ๋ฆฌ์—์„œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ (Concrete Product)

-> ์ถ”์ƒ ๊ธฐ๋Šฅ ์ธํ„ฐํŽ˜์ด์Šค(Abstract Product)๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•œ ๊ตฌํ˜„ ํด๋ž˜์Šค(Concrete Product)์—์„œ ๊ธฐ๋Šฅ ๋ฐ˜ํ™˜ ์ˆœ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

 

4. ์ถ”์ƒ ํŒฉํ† ๋ฆฌ์˜ ์žฅ๋‹จ์   

 

์žฅ์  : 

1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค.

- ํŒฉํ† ๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ธฐ๋Šฅ์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •๊ณผ ์ฑ…์ž„์„ ์บก์Šํ™” ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

2. ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ตฌํ˜„์ฒด๋ฅผ ๋ณ€๊ฒฝ ์‹œ์— ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ์ฝ”๋“œ๊ฐ€ ์ค„์–ด๋“ ๋‹ค.

 

๋‹จ์  :

1. ์ฝ”๋“œ๊ฐ€ ํ•„์š” ์ด์ƒ์œผ๋กœ ๋ณต์žกํ•ด ์งˆ ์ˆ˜ ์žˆ๋‹ค.

2. ์ƒˆ๋กœ์šด ๋ฉ”์†Œ๋“œ(๊ธฐ๋Šฅ,์ œํ’ˆ ๋“ฑ) ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒŒ ์–ด๋ ต๋‹ค.

     - ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด Abstract Product๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋Š”๋ฐ ์ด๋Ÿฌ๋ฉด ๋ชจ๋“  ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•œ๋‹ค.

 

5. ๊ฒฐ๋ก 

 

์—ฌ๋Ÿฌ ์ œํ’ˆ์ด๋‚˜ ๊ธฐ๋Šฅ๊ตฐ์ด ์žˆ๊ณ  ๊ทธ๋“ค๋ผ๋ฆฌ ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅด๊ฑฐ๋‚˜ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ์กฐ๊ธˆ ๋ณต์žกํ•ด์ง€๊ฑฐ๋‚˜ ๋‚˜์ค‘์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ๋ฒˆ๊ฑฐ๋กœ์šธ ์ˆ˜ ์žˆ๋‹ค.

 

์ฐธ๊ณ ์ž๋ฃŒ

 

https://www.youtube.com/watch?v=qXcxySA-Qes&t=370s 

https://inpa.tistory.com/entry/GOF-%F0%9F%92%A0-%EC%B6%94%EC%83%81-%ED%8C%A9%ED%86%A0%EB%A6%ACAbstract-Factory-%ED%8C%A8%ED%84%B4-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EC%9E%90

 

๐Ÿ’  ์ถ”์ƒ ํŒฉํ† ๋ฆฌ(Abstract Factory) ํŒจํ„ด - ์™„๋ฒฝ ๋งˆ์Šคํ„ฐํ•˜๊ธฐ

Abstract Factory Pattern ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ์—ฐ๊ด€์„ฑ์ด ์žˆ๋Š” ๊ฐ์ฒด ๊ตฐ์ด ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์„ ๊ฒฝ์šฐ ์ด๋“ค์„ ๋ฌถ์–ด ์ถ”์ƒํ™”ํ•˜๊ณ , ์–ด๋–ค ๊ตฌ์ฒด์ ์ธ ์ƒํ™ฉ์ด ์ฃผ์–ด์ง€๋ฉด ํŒฉํ† ๋ฆฌ ๊ฐ์ฒด์—์„œ ์ง‘ํ•ฉ์œผ๋กœ ๋ฌถ์€ ๊ฐ์ฒด ๊ตฐ์„ ๊ตฌํ˜„ํ™”

inpa.tistory.com

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

https://refactoring.guru/ko/design-patterns/abstract-factory

 

์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด

/ ๋””์ž์ธ ํŒจํ„ด๋“ค / ์ƒ์„ฑ ํŒจํ„ด ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด ๋‹ค์Œ ์ด๋ฆ„์œผ๋กœ๋„ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค: Abstract Factory ์˜๋„ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ๋Š” ๊ด€๋ จ ๊ฐ์ฒด๋“ค์˜ ๊ตฌ์ƒ ํด๋ž˜์Šค๋“ค์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ๊ด€๋ จ ๊ฐ์ฒด๋“ค์˜ ๋ชจ์Œ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ

refactoring.guru