๐Ÿ“š Design Pattern - 1

kkmdevelยท2024๋…„ 10์›” 9์ผ

DesignPattern

๋ชฉ๋ก ๋ณด๊ธฐ
1/4

๐Ÿ“‹ Design Pattern

๋””์ž์ธ ํŒจํ„ด์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฒ€์ฆ๋œ ๋ฐฉ๋ฒ•

โ“ ์“ฐ๋Š” ์ด์œ 

  • ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ: ๋™์ผํ•œ ํŒจํ„ด์„ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ ์ค‘๋ณต์„ ์ค„์ด๊ณ , ์ƒ์‚ฐ์„ฑ์„ ๋†’์ž„

  • ์œ ์ง€๋ณด์ˆ˜์„ฑ: ๊ตฌ์กฐํ™”๋œ ์ฝ”๋“œ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ -> ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง€๊ณ  ์ƒˆ๋กœ์šด ์š”๊ตฌ์‚ฌํ•ญ์ด ์ƒ๊ฒผ์„ ๋•Œ ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ๊ฐ„ํŽธ

  • ํ™•์žฅ์„ฑ: ๊ฐ์ฒด๋‚˜ ๋ชจ๋“ˆ์„ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์šฉ์ดํ•˜์—ฌ, ์‹œ์Šคํ…œ์ด ์ปค์ ธ๋„ ์œ ์—ฐ์„ฑ์„ ์œ ์ง€ ๊ฐ€๋Šฅ

  • ํšจ์œจ์ ์ธ ํ˜‘์—…: ํŒ€ ๋‚ด์—์„œ ๋””์ž์ธ ํŒจํ„ด์„ ๊ณต์œ ํ•˜๋ฉด, ์„œ๋กœ์˜ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ํ˜‘์—…ํ•˜๋Š” ๋ฐ์— ๋„์›€


๐Ÿ“— ์ƒ์„ฑ ํŒจํ„ด (Creational Patterns)

๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๊ด€๋ จ๋œ ํŒจํ„ด

๐Ÿ“„ ์‹ฑ๊ธ€ํ†ค (Singleton)

ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์— ์˜ค์ง ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ๊ฐ€์ง€๋Š” ํŒจํ„ด

์žฅ์  ๋ฐ ์‚ฌ์šฉ ์ด์œ 

  • ์ „์—ญ ์ ‘๊ทผ: ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ์—์„œ ๊ณต์œ ํ•ด, ์„ค์ • ๊ด€๋ฆฌ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ฐ™์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ.

  • ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ: ๊ฐ์ฒด๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑํ•ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ค„์ด๊ณ , ๋ถˆํ•„์š”ํ•œ ์ค‘๋ณต ์ƒ์„ฑ์ด ์—†์Œ.

  • ์ผ๊ด€์„ฑ ์œ ์ง€: ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉํ•ด ์ƒํƒœ์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Œ.

๋‹จ์  ๋ฐ TDD, ์˜์กด์„ฑ ์ฃผ์ž…๊ณผ์˜ ๊ด€๊ณ„

  • ํ…Œ์ŠคํŠธ ์–ด๋ ค์›€ (TDD ๋ฌธ์ œ): ์‹ฑ๊ธ€ํ†ค์€ ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•ด ํ…Œ์ŠคํŠธ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๊ธฐ ์–ด๋ ค์›€. ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ(TDD)์—์„œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Œ.

  • ์˜์กด์„ฑ ์ฆ๊ฐ€: ํด๋ž˜์Šค๊ฐ€ ์‹ฑ๊ธ€ํ†ค์— ์ง์ ‘ ์˜์กดํ•˜๋ฉด ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์ ธ ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง.

  • ์˜์กด์„ฑ ์ฃผ์ž…์œผ๋กœ ํ•ด๊ฒฐ: ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›์œผ๋ฉด, ๋ชจ์˜ ๊ฐ์ฒด(Mock)๋ฅผ ์‚ฌ์šฉํ•ด ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ด๊ณ , ๊ฒฐํ•ฉ๋„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ.

TDD : ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ  ์ด๋ฅผ ํ†ต๊ณผํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹
์˜์กด์„ฑ ์ฃผ์ž… : ๊ฐ์ฒด๋ฅผ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›์•„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋Š” ๊ธฐ๋ฒ•

๐Ÿ“„ ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด (Factory Method Pattern)

๊ฐ์ฒด ์ƒ์„ฑ์˜ ์ฑ…์ž„์„ ์„œ๋ธŒํด๋ž˜์Šค์— ์œ„์ž„ํ•˜๋Š” ํŒจํ„ด
์ƒ์œ„ ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ๋ฒ•์„ ์•Œ ํ•„์š” ์—†์œผ๋ฉฐ, ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•จ.

์žฅ์  ๋ฐ ์‚ฌ์šฉ ์ด์œ 

  • ์œ ์—ฐ์„ฑ: ๊ฐ์ฒด ์ƒ์„ฑ ๋กœ์ง์„ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด ์œ ์—ฐํ•œ ์„ค๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•จ.

  • ํ™•์žฅ์„ฑ: ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ถ”๊ฐ€๋˜๋”๋ผ๋„ ์ƒ์œ„ ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ฝ”๋“œ์˜ ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’์•„์ง.

  • ์ฝ”๋“œ ์บก์Аํ™”: ๊ฐ์ฒด ์ƒ์„ฑ ๊ณผ์ •์„ ๋ถ„๋ฆฌํ•ด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ ๋กœ์ง์„ ์•Œ ํ•„์š” ์—†๊ฒŒ ํ•˜์—ฌ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง.

๋‹จ์  : ์„œ๋ธŒํด๋ž˜์Šค๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ , ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Œ.

์˜ˆ์‹œ

public abstract class CoffeeFactory {
    abstract Coffee createCoffee(String type);
}


public class EspressoFactory extends CoffeeFactory {
    @Override
    Coffee createCoffee(String type) {
        switch(type) {
        case "espresso":
            return new Espresso();
        case "latte":
            return new Latte();
        }
        return null;
    }
}

์ƒ์„ฑํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ณ„๋„๋กœ ๋‘”๋‹ค.
๊ฐ์ฒด์— ๋„˜์–ด์˜ค๋Š” ๊ฐ’์— ๋”ฐ๋ผ์„œ, ๋‹ค๋ฅธ ์ปคํ”ผ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค.

profile
25/08/12

0๊ฐœ์˜ ๋Œ“๊ธ€