๐Ÿญ ํŒฉํ† ๋ฆฌ ํŒจํ„ด: ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿญ ํŒฉํ† ๋ฆฌ ํŒจํ„ด: ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ๐Ÿš€

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ์ฝ”๋”ฉ ๋งˆ๋ฒ•์‚ฌ ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ํ•จ๊ป˜ ์ฆ๊ฑฐ์šด ์‹œ๊ฐ„์„ ๋ณด๋‚ด๋ ค๊ณ  ํ•ด์š”. ๋ฐ”๋กœ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๐Ÿง™โ€โ™‚๏ธโœจ

์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ๊ณต์žฅ์— ๊ฐ€๋ณธ ์  ์žˆ๋‚˜์š”? ๊ณต์žฅ์—์„œ๋Š” ๋‹ค์–‘ํ•œ ์ œํ’ˆ๋“ค์ด ๋งŒ๋“ค์–ด์ง€์ฃ . ํŒฉํ† ๋ฆฌ ํŒจํ„ด๋„ ์ด์™€ ๋น„์Šทํ•ด์š”. ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณต์žฅ ๊ฐ™์€ ๊ฑฐ๋ž๋‹ˆ๋‹ค! ์ด ํŒจํ„ด์„ ์ดํ•ดํ•˜๊ณ  ๋‚˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„๋„ ๊ฐ์ฒด ์ƒ์„ฑ์˜ ๋‹ฌ์ธ์ด ๋  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ์ฐพ์•„ ๊ฑฐ๋ž˜ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ํŒฉํ† ๋ฆฌ ํŒจํ„ด์œผ๋กœ ๋‹ค์–‘ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ๐Ÿญ๐Ÿ› ๏ธ

๐ŸŽ“ ํ•™์Šต ๋ชฉํ‘œ:

  • ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ๊ฐœ๋… ์ดํ•ดํ•˜๊ธฐ
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ํŒฉํ† ๋ฆฌ ํŒจํ„ด ๊ตฌํ˜„ํ•˜๊ธฐ
  • ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ํŒฉํ† ๋ฆฌ ํŒจํ„ด ํ™œ์šฉํ•˜๊ธฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์ฝ”๋”ฉ ๋ชจํ—˜์„ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ์•ˆ์ „๋ฒจํŠธ ๊ฝ‰ ๋งค์„ธ์š”. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ์„ธ๊ณ„๋กœ ์ถœ๋ฐœํ•ฉ๋‹ˆ๋‹ค! ๐Ÿš€

๐Ÿง  ํŒฉํ† ๋ฆฌ ํŒจํ„ด: ๊ฐ์ฒด ์ƒ์„ฑ์˜ ๋งˆ๋ฒ•

ํŒฉํ† ๋ฆฌ ํŒจํ„ด์ด ๋ญ”์ง€ ๊ถ๊ธˆํ•˜์‹œ์ฃ ? ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ๊ฐ์ฒด ์ƒ์„ฑ์„ ์บก์Šํ™”ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ด์—์š”. ์Œ... ๋ญ”๊ฐ€ ์–ด๋ ค์›Œ ๋ณด์ด๋‚˜์š”? ๊ฑฑ์ • ๋งˆ์„ธ์š”! ์šฐ๋ฆฌ ํ•จ๊ป˜ ์ฐจ๊ทผ์ฐจ๊ทผ ์•Œ์•„๊ฐ€ ๋ด์š”. ๐Ÿ•ต๏ธโ€โ™€๏ธ

์ƒ์ƒํ•ด๋ณด์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์ด ํ”ผ์ž ๊ฐ€๊ฒŒ ์ฃผ์ธ์ด๋ผ๊ณ ์š”. ์†๋‹˜๋“ค์€ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ํ”ผ์ž๋ฅผ ์ฃผ๋ฌธํ•˜๊ฒ ์ฃ ? ๋งˆ๋ฅด๊ฒŒ๋ฆฌํƒ€, ํŽ˜ํผ๋กœ๋‹ˆ, ํ•˜์™€์ด์•ˆ... ๊ฐ๊ฐ์˜ ํ”ผ์ž๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅด์ง€๋งŒ, ๊ฒฐ๊ตญ ๋ชจ๋‘ 'ํ”ผ์ž'๋ผ๋Š” ํฐ ๋ฒ”์ฃผ์— ์†ํ•˜์ž–์•„์š”.

์ด๋•Œ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด, ํ”ผ์ž ์ฃผ๋ฌธ์„ ๋ฐ›๊ณ  ์ ์ ˆํ•œ ํ”ผ์ž ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์„ ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”! ๐Ÿ•๐Ÿ‘จโ€๐Ÿณ

๐ŸŒŸ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ์žฅ์ :

  • ๊ฐ์ฒด ์ƒ์„ฑ ๋กœ์ง์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌ (์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด)
  • ๊ฐ์ฒด ์ƒ์„ฑ ๊ณผ์ •์„ ์ถ”์ƒํ™” (ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์™€ ๋ถ„๋ฆฌ)
  • ์ƒˆ๋กœ์šด ํƒ€์ž…์˜ ๊ฐ์ฒด ์ถ”๊ฐ€๊ฐ€ ์‰ฌ์›€ (ํ™•์žฅ์„ฑ ๊ตฟ!)

์ž, ์ด์ œ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์•Œ์•˜์œผ๋‹ˆ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณผ๊นŒ์š”? ์šฐ๋ฆฌ์˜ ํ”ผ์ž ๊ฐ€๊ฒŒ ์˜ˆ์‹œ๋ฅผ ๊ณ„์† ์ด์–ด๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ•๐Ÿ› ๏ธ

ํŒฉํ† ๋ฆฌ ํŒจํ„ด ๋‹ค์ด์–ด๊ทธ๋žจ ํ”ผ์ž ํŒฉํ† ๋ฆฌ ๋งˆ๋ฅด๊ฒŒ๋ฆฌํƒ€ ํŽ˜ํผ๋กœ๋‹ˆ ํ•˜์™€์ด์•ˆ ํ”ผ์ž ๊ฐ์ฒด๋“ค

์œ„ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ๋ณด์„ธ์š”. ํ”ผ์ž ํŒฉํ† ๋ฆฌ๊ฐ€ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ํ”ผ์ž ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ชจ์Šต์„ ํ‘œํ˜„ํ–ˆ์–ด์š”. ์ด๊ฒŒ ๋ฐ”๋กœ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ํ•ต์‹ฌ์ด๋ž๋‹ˆ๋‹ค! ๐Ÿ˜Š

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ด ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์‹ค์ œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? Let's code! ๐Ÿ’ป๐Ÿš€

๐Ÿ› ๏ธ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ํŒฉํ† ๋ฆฌ ํŒจํ„ด ๊ตฌํ˜„ํ•˜๊ธฐ

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ๊ตฌํ˜„ํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”. ์šฐ๋ฆฌ์˜ ํ”ผ์ž ๊ฐ€๊ฒŒ ์˜ˆ์‹œ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ• ๊ฒŒ์š”. ์ฝ”๋“œ๋ฅผ ๋”ฐ๋ผ ์น˜๋ฉด์„œ ํ•จ๊ป˜ ๋ฐฐ์›Œ๋ด์š”! ๐Ÿ•๐Ÿ‘จโ€๐Ÿ’ป

๋จผ์ €, ํ”ผ์ž์˜ ๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ด๋ณผ๊นŒ์š”?


interface Pizza {
  name: string;
  prepare(): void;
  bake(): void;
  cut(): void;
  box(): void;
}
  

์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ชจ๋“  ํ”ผ์ž๊ฐ€ ๊ฐ€์ ธ์•ผ ํ•  ๊ธฐ๋ณธ์ ์ธ ๋ฉ”์„œ๋“œ๋“ค์„ ์ •์˜ํ•˜๊ณ  ์žˆ์–ด์š”. ์ด์ œ ๊ฐ ํ”ผ์ž ์ข…๋ฅ˜๋ณ„๋กœ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”.


class MargheritaPizza implements Pizza {
  name = "๋งˆ๋ฅด๊ฒŒ๋ฆฌํƒ€ ํ”ผ์ž";

  prepare() {
    console.log(`${this.name} ์ค€๋น„ ์ค‘: ๋„์šฐ ํŽด๊ธฐ, ํ† ๋งˆํ†  ์†Œ์Šค ๋ฐ”๋ฅด๊ธฐ`);
  }

  bake() {
    console.log(`${this.name} ๊ตฝ๋Š” ์ค‘: 180๋„์—์„œ 20๋ถ„๊ฐ„`);
  }

  cut() {
    console.log(`${this.name} ์ž๋ฅด๋Š” ์ค‘: 8์กฐ๊ฐ์œผ๋กœ ์ปทํŒ…`);
  }

  box() {
    console.log(`${this.name} ํฌ์žฅ ์ค‘: ํŠน๋ณ„ํ•œ ๋งˆ๋ฅด๊ฒŒ๋ฆฌํƒ€ ๋ฐ•์Šค์— ๋‹ด๊ธฐ`);
  }
}

class PepperoniPizza implements Pizza {
  name = "ํŽ˜ํผ๋กœ๋‹ˆ ํ”ผ์ž";

  prepare() {
    console.log(`${this.name} ์ค€๋น„ ์ค‘: ๋„์šฐ ํŽด๊ธฐ, ํ† ๋งˆํ†  ์†Œ์Šค ๋ฐ”๋ฅด๊ธฐ, ํŽ˜ํผ๋กœ๋‹ˆ ํ† ํ•‘`);
  }

  bake() {
    console.log(`${this.name} ๊ตฝ๋Š” ์ค‘: 200๋„์—์„œ 15๋ถ„๊ฐ„`);
  }

  cut() {
    console.log(`${this.name} ์ž๋ฅด๋Š” ์ค‘: 6์กฐ๊ฐ์œผ๋กœ ์ปทํŒ…`);
  }

  box() {
    console.log(`${this.name} ํฌ์žฅ ์ค‘: ์ผ๋ฐ˜ ํ”ผ์ž ๋ฐ•์Šค์— ๋‹ด๊ธฐ`);
  }
}

class HawaiianPizza implements Pizza {
  name = "ํ•˜์™€์ด์•ˆ ํ”ผ์ž";

  prepare() {
    console.log(`${this.name} ์ค€๋น„ ์ค‘: ๋„์šฐ ํŽด๊ธฐ, ํ† ๋งˆํ†  ์†Œ์Šค ๋ฐ”๋ฅด๊ธฐ, ํŒŒ์ธ์• ํ”Œ๊ณผ ํ–„ ํ† ํ•‘`);
  }

  bake() {
    console.log(`${this.name} ๊ตฝ๋Š” ์ค‘: 190๋„์—์„œ 18๋ถ„๊ฐ„`);
  }

  cut() {
    console.log(`${this.name} ์ž๋ฅด๋Š” ์ค‘: ์›ํ˜•์œผ๋กœ ์ปทํŒ…`);
  }

  box() {
    console.log(`${this.name} ํฌ์žฅ ์ค‘: ํŠธ๋กœํ”ผ์ปฌ ๋””์ž์ธ ๋ฐ•์Šค์— ๋‹ด๊ธฐ`);
  }
}
  

์™€์šฐ! ์šฐ๋ฆฌ๊ฐ€ ๋ฐฉ๊ธˆ ์„ธ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ํ”ผ์ž ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์–ด์š”. ๊ฐ ํ”ผ์ž๋Š” ์ž์‹ ๋งŒ์˜ ํŠน๋ณ„ํ•œ ์ค€๋น„, ๊ตฝ๊ธฐ, ์ž๋ฅด๊ธฐ, ํฌ์žฅ ๋ฐฉ๋ฒ•์„ ๊ฐ€์ง€๊ณ  ์žˆ์ฃ . ์ด์ œ ์ด ํ”ผ์ž๋“ค์„ ์ƒ์„ฑํ•  ํŒฉํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ์ฐจ๋ก€์˜ˆ์š”. ๐Ÿญ


class PizzaFactory {
  createPizza(type: string): Pizza {
    switch(type.toLowerCase()) {
      case "margherita":
        return new MargheritaPizza();
      case "pepperoni":
        return new PepperoniPizza();
      case "hawaiian":
        return new HawaiianPizza();
      default:
        throw new Error("Unknown pizza type");
    }
  }
}
  

์งœ์ž”! ๐ŸŽ‰ ์šฐ๋ฆฌ์˜ ํ”ผ์ž ํŒฉํ† ๋ฆฌ๊ฐ€ ์™„์„ฑ๋˜์—ˆ์–ด์š”. ์ด ํŒฉํ† ๋ฆฌ๋Š” ํ”ผ์ž ์ข…๋ฅ˜๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ํ•ด๋‹นํ•˜๋Š” ํ”ผ์ž ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค. ์ด์ œ ์ด ํŒฉํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด๋ณผ๊นŒ์š”?


const factory = new PizzaFactory();

const margherita = factory.createPizza("margherita");
margherita.prepare();
margherita.bake();
margherita.cut();
margherita.box();

const pepperoni = factory.createPizza("pepperoni");
pepperoni.prepare();
pepperoni.bake();
pepperoni.cut();
pepperoni.box();

const hawaiian = factory.createPizza("hawaiian");
hawaiian.prepare();
hawaiian.bake();
hawaiian.cut();
hawaiian.box();
  

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ ํ”ผ์ž ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ๊ฐ์ž์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ํ”ผ์ž๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ณผ์ •์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ์ •๋ง ๋ฉ‹์ง€์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜ƒ

๐ŸŒŸ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ์žฅ์  (๋‹ค์‹œ ํ•œ ๋ฒˆ!):

  • ๊ฐ์ฒด ์ƒ์„ฑ ๋กœ์ง์ด ํ•œ ๊ณณ(PizzaFactory)์— ์ง‘์ค‘๋˜์–ด ์žˆ์–ด ๊ด€๋ฆฌ๊ฐ€ ์‰ฌ์›Œ์š”.
  • ์ƒˆ๋กœ์šด ํ”ผ์ž ์ข…๋ฅ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์ƒˆ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ํŒฉํ† ๋ฆฌ์— case๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ผ์š”.
  • ํ”ผ์ž๋ฅผ ์ฃผ๋ฌธํ•˜๋Š” ์ฝ”๋“œ(ํด๋ผ์ด์–ธํŠธ)๋Š” ๊ตฌ์ฒด์ ์ธ ํ”ผ์ž ํด๋ž˜์Šค๋ฅผ ์•Œ ํ•„์š” ์—†์ด ํŒฉํ† ๋ฆฌ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋ผ์š”.

์ด ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์–ด์š”. ํ•˜์ง€๋งŒ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋ณด๋‹ค ๋” ๋ณต์žกํ•œ ์ƒํ™ฉ๋“ค์ด ์žˆ์„ ์ˆ˜ ์žˆ์ฃ . ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ข€ ๋” ์‹ค์ „์ ์ธ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋“ค์„ ์‚ดํŽด๋ณผ๊ฒŒ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? Let's dive deeper! ๐ŸŠโ€โ™‚๏ธ๐ŸŒŠ

๐Ÿš€ ์‹ค์ „ ํ”„๋กœ์ ํŠธ์—์„œ์˜ ํŒฉํ† ๋ฆฌ ํŒจํ„ด

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ๊ธฐ๋ณธ์„ ๋งˆ์Šคํ„ฐํ–ˆ์–ด์š”. ํ•˜์ง€๋งŒ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ™œ์šฉ๋ ๊นŒ์š”? ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์„ ์˜ˆ๋กœ ๋“ค์–ด ์ข€ ๋” ๋ณต์žกํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๐ŸŒŸ

์žฌ๋Šฅ๋„ท์—์„œ๋Š” ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์žฌ๋Šฅ์ด ๊ฑฐ๋ž˜๋˜๊ณ  ์žˆ์ฃ ? ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๋””์ž์ธ, ๋ฒˆ์—ญ ๋“ฑ๋“ฑ... ์ด๋Ÿฐ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ๋“ค์„ ๊ฐ์ฒด๋กœ ํ‘œํ˜„ํ•˜๊ณ  ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด์š”. ์ด๋•Œ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์ด ์•„์ฃผ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ˜Š

๋จผ์ €, ์žฌ๋Šฅ์˜ ๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ด๋ณผ๊นŒ์š”?


interface Talent {
  name: string;
  category: string;
  description: string;
  price: number;
  estimatedTime: string;
  performService(): void;
}
  

์ด์ œ ๊ฐ ์žฌ๋Šฅ ์œ ํ˜•๋ณ„๋กœ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”.


class ProgrammingTalent implements Talent {
  constructor(
    public name: string,
    public description: string,
    public price: number,
    public estimatedTime: string
  ) {}

  category = "ํ”„๋กœ๊ทธ๋ž˜๋ฐ";

  performService() {
    console.log(`${this.name} ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์„œ๋น„์Šค ์ˆ˜ํ–‰ ์ค‘...`);
    console.log(`์ฝ”๋“œ ์ž‘์„ฑ, ํ…Œ์ŠคํŠธ, ๋””๋ฒ„๊น… ์ง„ํ–‰`);
  }
}

class DesignTalent implements Talent {
  constructor(
    public name: string,
    public description: string,
    public price: number,
    public estimatedTime: string
  ) {}

  category = "๋””์ž์ธ";

  performService() {
    console.log(`${this.name} ๋””์ž์ธ ์„œ๋น„์Šค ์ˆ˜ํ–‰ ์ค‘...`);
    console.log(`์ปจ์…‰ ๊ตฌ์ƒ, ์Šค์ผ€์น˜, ๋””์ง€ํ„ธ ์ž‘์—… ์ง„ํ–‰`);
  }
}

class TranslationTalent implements Talent {
  constructor(
    public name: string,
    public description: string,
    public price: number,
    public estimatedTime: string
  ) {}

  category = "๋ฒˆ์—ญ";

  performService() {
    console.log(`${this.name} ๋ฒˆ์—ญ ์„œ๋น„์Šค ์ˆ˜ํ–‰ ์ค‘...`);
    console.log(`์›๋ฌธ ๋ถ„์„, ๋ฒˆ์—ญ, ๊ต์ • ์ž‘์—… ์ง„ํ–‰`);
  }
}
  

์™€์šฐ! ์šฐ๋ฆฌ๊ฐ€ ๋ฐฉ๊ธˆ ์„ธ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์žฌ๋Šฅ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์–ด์š”. ๊ฐ ์žฌ๋Šฅ์€ ์ž์‹ ๋งŒ์˜ ํŠน๋ณ„ํ•œ ์„œ๋น„์Šค ์ˆ˜ํ–‰ ๋ฐฉ๋ฒ•์„ ๊ฐ€์ง€๊ณ  ์žˆ์ฃ . ์ด์ œ ์ด ์žฌ๋Šฅ๋“ค์„ ์ƒ์„ฑํ•  ํŒฉํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ์ฐจ๋ก€์˜ˆ์š”. ๐Ÿญ


class TalentFactory {
  createTalent(type: string, name: string, description: string, price: number, estimatedTime: string): Talent {
    switch(type.toLowerCase()) {
      case "programming":
        return new ProgrammingTalent(name, description, price, estimatedTime);
      case "design":
        return new DesignTalent(name, description, price, estimatedTime);
      case "translation":
        return new TranslationTalent(name, description, price, estimatedTime);
      default:
        throw new Error("Unknown talent type");
    }
  }
}
  

์งœ์ž”! ๐ŸŽ‰ ์šฐ๋ฆฌ์˜ ์žฌ๋Šฅ ํŒฉํ† ๋ฆฌ๊ฐ€ ์™„์„ฑ๋˜์—ˆ์–ด์š”. ์ด ํŒฉํ† ๋ฆฌ๋Š” ์žฌ๋Šฅ ์ข…๋ฅ˜์™€ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ํ•ด๋‹นํ•˜๋Š” ์žฌ๋Šฅ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค. ์ด์ œ ์ด ํŒฉํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด๋ณผ๊นŒ์š”?


const talentFactory = new TalentFactory();

const webDevelopment = talentFactory.createTalent(
  "programming",
  "์›น ๊ฐœ๋ฐœ",
  "๋ฐ˜์‘ํ˜• ์›น์‚ฌ์ดํŠธ ๊ฐœ๋ฐœ",
  500000,
  "2์ฃผ"
);

const logoDesign = talentFactory.createTalent(
  "design",
  "๋กœ๊ณ  ๋””์ž์ธ",
  "ํ˜„๋Œ€์ ์ด๊ณ  ์‹ฌํ”Œํ•œ ๋กœ๊ณ  ๋””์ž์ธ",
  300000,
  "1์ฃผ"
);

const koreanToEnglish = talentFactory.createTalent(
  "translation",
  "ํ•œ์˜ ๋ฒˆ์—ญ",
  "์ „๋ฌธ ๋ฌธ์„œ ํ•œ๊ตญ์–ด์—์„œ ์˜์–ด๋กœ ๋ฒˆ์—ญ",
  100000,
  "3์ผ"
);

webDevelopment.performService();
logoDesign.performService();
koreanToEnglish.performService();
  

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ ์žฌ๋Šฅ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ๊ฐ์ž์˜ ์„œ๋น„์Šค ์ˆ˜ํ–‰ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์žฌ๋Šฅ์ด ๋ฐœํœ˜๋˜๋Š” ๊ณผ์ •์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ์ •๋ง ๋ฉ‹์ง€์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜ƒ

๐ŸŒŸ ์‹ค์ „์—์„œ์˜ ํŒฉํ† ๋ฆฌ ํŒจํ„ด ์žฅ์ :

  • ์ƒˆ๋กœ์šด ์žฌ๋Šฅ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‰ฌ์›Œ์š”. ์ƒˆ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ํŒฉํ† ๋ฆฌ์— case๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ์žฌ๋Šฅ ์ƒ์„ฑ ๋กœ์ง์ด ํ•œ ๊ณณ์— ์ง‘์ค‘๋˜์–ด ์žˆ์–ด ๊ด€๋ฆฌ์™€ ์ˆ˜์ •์ด ์šฉ์ดํ•ด์š”.
  • ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ(์žฌ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ)๋Š” ๊ตฌ์ฒด์ ์ธ ์žฌ๋Šฅ ํด๋ž˜์Šค๋ฅผ ์•Œ ํ•„์š” ์—†์ด ํŒฉํ† ๋ฆฌ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋ผ์š”.
  • ์žฌ๋Šฅ์˜ ์ƒ์„ฑ๊ณผ ์‚ฌ์šฉ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์–ด์š”.

์ด ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ํŒฉํ† ๋ฆฌ ํŒจํ„ด์ด ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ดค์–ด์š”. ์žฌ๋Šฅ๋„ท๊ณผ ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ๋“ค์„ ๊ฐ์ฒด๋กœ ๊ด€๋ฆฌํ•˜๋ฉด, ์‹œ์Šคํ…œ์„ ํ›จ์”ฌ ๋” ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค. ๐Ÿ‘จโ€๐Ÿซ

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋์ด ์•„๋‹ˆ์—์š”! ํŒฉํ† ๋ฆฌ ํŒจํ„ด์—๋Š” ๋” ๋งŽ์€ ๋ณ€ํ˜•๊ณผ ์‘์šฉ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ต๋‹ˆ๋‹ค. ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด๊ณผ ๊ฐ™์€ ๊ณ ๊ธ‰ ์ฃผ์ œ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. Ready for more? Let's go! ๐Ÿš€

๐ŸŒˆ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•: ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ๊ธฐ๋ณธ๊ณผ ์‹ค์ „ ํ™œ์šฉ๋ฒ•์„ ๋งˆ์Šคํ„ฐํ–ˆ์–ด์š”. ํ•˜์ง€๋งŒ ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ์„ธ๊ณ„๋Š” ๋” ๊นŠ๊ณ  ๋„“๋‹ต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ "๋ณด์Šค" ๋ ˆ๋ฒจ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด(Abstract Factory Pattern)์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๐ŸŽญ

์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ๊ด€๋ จ๋œ ๊ฐ์ฒด๋“ค์˜ ์ง‘ํ•ฉ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ด์š”. ์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ผ๊นŒ์š”? ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด ๋“œ๋ฆด๊ฒŒ์š”! ๐Ÿ˜Š

์šฐ๋ฆฌ์˜ ์žฌ๋Šฅ๋„ท ์˜ˆ์ œ๋ฅผ ์กฐ๊ธˆ ๋” ํ™•์žฅํ•ด๋ณผ๊นŒ์š”? ์ด๋ฒˆ์—๋Š” ์žฌ๋Šฅ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ฐ ์žฌ๋Šฅ์— ๋งž๋Š” ํ‰๊ฐ€ ์‹œ์Šคํ…œ๊ณผ ๊ฒฐ์ œ ์‹œ์Šคํ…œ๋„ ํ•จ๊ป˜ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด์š”.

๐ŸŒŸ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ๊ตฌ์„ฑ์š”์†Œ:

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

์ž, ์ด์ œ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋ณผ๊นŒ์š”? ๐Ÿ› ๏ธ


// ์ถ”์ƒ ์ œํ’ˆ๋“ค
interface Talent {
  performService(): void;
}

interface Evaluation {
  evaluate(): void;
}

interface Payment {
  process(): void;
}

// ๊ตฌ์ฒด์ ์ธ ์ œํ’ˆ๋“ค (ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ด€๋ จ)
class ProgrammingTalent implements Talent {
  performService() {
    console.log("ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์„œ๋น„์Šค ์ˆ˜ํ–‰ ์ค‘...");
  }
}

class CodeReviewEvaluation implements Evaluation {
  evaluate() {
    console.log("์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ํ†ตํ•œ ํ‰๊ฐ€ ์ง„ํ–‰ ์ค‘...");
  }
}

class CryptoPayment implements Payment {
  process() {
    console.log("์•”ํ˜ธํ™”ํ๋กœ ๊ฒฐ์ œ ์ฒ˜๋ฆฌ ์ค‘...");
  }
}

// ๊ตฌ์ฒด์ ์ธ ์ œํ’ˆ๋“ค (๋””์ž์ธ ๊ด€๋ จ)
class DesignTalent implements Talent {
  performService() {
    console.log("๋””์ž์ธ ์„œ๋น„์Šค ์ˆ˜ํ–‰ ์ค‘...");
  }
}

class PortfolioEvaluation implements Evaluation {
  evaluate() {
    console.log("ํฌํŠธํด๋ฆฌ์˜ค ๊ฒ€ํ† ๋ฅผ ํ†ตํ•œ ํ‰๊ฐ€ ์ง„ํ–‰ ์ค‘...");
  }
}

class CreditCardPayment implements Payment {
  process() {
    console.log("์‹ ์šฉ์นด๋“œ๋กœ ๊ฒฐ์ œ ์ฒ˜๋ฆฌ ์ค‘...");
  }
}

// ์ถ”์ƒ ํŒฉํ† ๋ฆฌ
interface TalentServiceFactory {
  createTalent(): Talent;
  createEvaluation(): Evaluation;
  createPayment(): Payment;
}

// ๊ตฌ์ฒด์ ์ธ ํŒฉํ† ๋ฆฌ๋“ค
class ProgrammingServiceFactory implements TalentServiceFactory {
  createTalent(): Talent {
    return new ProgrammingTalent();
  }

  createEvaluation(): Evaluation {
    return new CodeReviewEvaluation();
  }

  createPayment(): Payment {
    return new CryptoPayment();
  }
}

class DesignServiceFactory implements TalentServiceFactory {
  createTalent(): Talent {
    return new DesignTalent();
  }

  createEvaluation(): Evaluation {
    return new PortfolioEvaluation();
  }

  createPayment(): Payment {
    return new CreditCardPayment();
  }
}

// ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ
function clientCode(factory: TalentServiceFactory) {
  const talent = factory.createTalent();
  const evaluation = factory.createEvaluation();
  const payment = factory.createPayment();

  talent.performService();
  evaluation.evaluate();
  payment.process();
}

// ์‚ฌ์šฉ ์˜ˆ
console.log("ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์„œ๋น„์Šค ์ด์šฉ:");
clientCode(new ProgrammingServiceFactory());

console.log("\n");

console.log("๋””์ž์ธ ์„œ๋น„์Šค ์ด์šฉ:");
clientCode(new DesignServiceFactory());
  

์™€์šฐ! ์šฐ๋ฆฌ๊ฐ€ ๋ฐฉ๊ธˆ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ๊ตฌํ˜„ํ–ˆ์–ด์š”. ๐Ÿ˜ฎ ์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ด€๋ จ๋œ ๊ฐ์ฒด๋“ค(์žฌ๋Šฅ, ํ‰๊ฐ€, ๊ฒฐ์ œ)์„ ํ•จ๊ป˜ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”. ๊ฐ ์„œ๋น„์Šค ์œ ํ˜•(ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๋””์ž์ธ) ์— ๋งž๋Š” ๊ฐ์ฒด๋“ค์ด ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ƒ์„ฑ๋˜์ฃ . ์ •๋ง ๋ฉ‹์ง€์ง€ ์•Š๋‚˜์š”? ๐ŸŒŸ

๐ŸŽ“ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ์žฅ์ :

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

์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์žฌ๋Šฅ๋„ท๊ณผ ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค ์œ ํ˜•์„ ์‰ฝ๊ฒŒ ํ™•์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒˆ๋กœ์šด ์„œ๋น„์Šค ์œ ํ˜•(์˜ˆ: ๋งˆ์ผ€ํŒ…)์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ๊ตฌ์ฒด์ ์ธ ํŒฉํ† ๋ฆฌ์™€ ๊ด€๋ จ ์ œํ’ˆ๋“ค๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ‘จโ€๐Ÿ’ผ

ํ•˜์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์—๋Š” ์žฅ๋‹จ์ ์ด ์žˆ์ฃ . ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ๋‹จ์ ๋„ ์•Œ์•„๋ณผ๊นŒ์š”?

โš ๏ธ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ์ฃผ์˜์ :

  • ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์ธํ„ฐํŽ˜์ด์Šค์™€ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•˜์ฃ .
  • ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ์ œํ’ˆ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒฉํ† ๋ฆฌ์— ์ƒˆ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋‹ˆ๊นŒ์š”.
  • ๋•Œ๋กœ๋Š” ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋กœ ์ธํ•ด ์ฝ”๋“œ ์ดํ•ด๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์–ธ์ œ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”? ๐Ÿค”

  • ์‹œ์Šคํ…œ์ด ์—ฌ๋Ÿฌ ์ œํ’ˆ๊ตฐ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ
  • ๊ด€๋ จ๋œ ๊ฐ์ฒด๋“ค์ด ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๊ณ , ์ด ์ ์„ ๊ฐ•์ œํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  • ์—ฌ๋Ÿฌ ๊ฐ์ฒด ๊ตฐ์„ ์ง€์›ํ•ด์•ผ ํ•˜์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ๊ธฐ๋ณธ๋ถ€ํ„ฐ ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•์ธ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด๊นŒ์ง€ ์‚ดํŽด๋ดค์–ด์š”. ์ด ํŒจํ„ด๋“ค์„ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜๋ฉด ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ๊ด€๋ จ๋œ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค. ๐ŸŽจ

ํ•˜์ง€๋งŒ ๊ธฐ์–ตํ•˜์„ธ์š”! ๋””์ž์ธ ํŒจํ„ด์€ ๋งŒ๋Šฅ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•ญ์ƒ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด์•ผ ํ•ด์š”. ๋•Œ๋กœ๋Š” ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ…์ด ๋” ์ข‹์„ ์ˆ˜๋„ ์žˆ์ฃ . ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ•ญ์ƒ ๊ทธ ํ•„์š”์„ฑ๊ณผ ๋ณต์žก์„ฑ์„ ์ž˜ ์ €์šธ์งˆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘จโ€๐Ÿซ

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ํŒฉํ† ๋ฆฌ ํŒจํ„ด ์—ฌํ–‰์ด ๊ฑฐ์˜ ๋๋‚˜๊ฐ€๊ณ  ์žˆ์–ด์š”. ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์ด ํŒจํ„ด๋“ค์„ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ์ƒ๊ฐํ•ด๋ณผ๊นŒ์š”? ๐Ÿš€

๐ŸŒŸ ์‹ค์ „ ์ ์šฉ: ์žฌ๋Šฅ๋„ท์—์„œ์˜ ํŒฉํ† ๋ฆฌ ํŒจํ„ด

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๋ชจ๋“  ๊ฒƒ์„ ์ข…ํ•ฉํ•ด์„œ ์žฌ๋Šฅ๋„ท ํ”Œ๋žซํผ์— ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ์‚ดํŽด๋ณผ๊นŒ์š”? ๐Ÿค“

์žฌ๋Šฅ๋„ท์€ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์˜ ์ „๋ฌธ๊ฐ€๋“ค์ด ์ž์‹ ์˜ ์žฌ๋Šฅ์„ ํŒ๋งคํ•˜๊ณ , ๊ตฌ๋งค์ž๋“ค์ด ํ•„์š”ํ•œ ์„œ๋น„์Šค๋ฅผ ์ฐพ์•„ ๊ตฌ๋งคํ•˜๋Š” ํ”Œ๋žซํผ์ด์—์š”. ์ด๋Ÿฐ ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์—์„œ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ์–ด๋–ป๊ฒŒ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์„๊นŒ์š”?

  1. ์„œ๋น„์Šค ์ƒ์„ฑ: ๊ธฐ๋ณธ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ์„œ๋น„์Šค(ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๋””์ž์ธ, ๋ฒˆ์—ญ ๋“ฑ)๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”.
  2. ๊ฒฐ์ œ ์‹œ์Šคํ…œ: ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๊ฒฐ์ œ ๋ฐฉ์‹(์‹ ์šฉ์นด๋“œ, ํŽ˜์ดํŒ”, ์•”ํ˜ธํ™”ํ ๋“ฑ)์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋“ค์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”.
  3. ํ‰๊ฐ€ ์‹œ์Šคํ…œ: ๊ฐ ์„œ๋น„์Šค ์œ ํ˜•์— ๋งž๋Š” ํ‰๊ฐ€ ์‹œ์Šคํ…œ์„ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  4. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ: ์„œ๋น„์Šค ๋งค์นญ, ์ถ”์ฒœ ์‹œ์Šคํ…œ ๋“ฑ ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ํ†ตํ•ด ์œ ์—ฐํ•˜๊ฒŒ ์„ ํƒํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ด๋ฅผ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•ด๋ณผ๊นŒ์š”? ๐Ÿ˜Š


// ์„œ๋น„์Šค ์ธํ„ฐํŽ˜์ด์Šค
interface Service {
  perform(): void;
  getPrice(): number;
}

// ๊ฒฐ์ œ ์ธํ„ฐํŽ˜์ด์Šค
interface Payment {
  processPayment(amount: number): void;
}

// ํ‰๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค
interface Evaluation {
  evaluate(service: Service): number;
}

// ์„œ๋น„์Šค ํŒฉํ† ๋ฆฌ
class ServiceFactory {
  createService(type: string): Service {
    switch(type) {
      case "programming":
        return new ProgrammingService();
      case "design":
        return new DesignService();
      case "translation":
        return new TranslationService();
      default:
        throw new Error("Unknown service type");
    }
  }
}

// ๊ฒฐ์ œ ์‹œ์Šคํ…œ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ
interface PaymentSystemFactory {
  createPayment(): Payment;
  createEvaluation(): Evaluation;
}

// ์‹ ์šฉ์นด๋“œ ๊ฒฐ์ œ ์‹œ์Šคํ…œ ํŒฉํ† ๋ฆฌ
class CreditCardSystemFactory implements PaymentSystemFactory {
  createPayment(): Payment {
    return new CreditCardPayment();
  }

  createEvaluation(): Evaluation {
    return new StarRatingEvaluation();
  }
}

// ์•”ํ˜ธํ™”ํ ๊ฒฐ์ œ ์‹œ์Šคํ…œ ํŒฉํ† ๋ฆฌ
class CryptoSystemFactory implements PaymentSystemFactory {
  createPayment(): Payment {
    return new CryptoPayment();
  }

  createEvaluation(): Evaluation {
    return new BlockchainEvaluation();
  }
}

// ์‚ฌ์šฉ ์˜ˆ์‹œ
class TalentNet {
  private serviceFactory: ServiceFactory;
  private paymentSystemFactory: PaymentSystemFactory;

  constructor(paymentType: string) {
    this.serviceFactory = new ServiceFactory();
    this.paymentSystemFactory = paymentType === "crypto" 
      ? new CryptoSystemFactory() 
      : new CreditCardSystemFactory();
  }

  orderService(serviceType: string) {
    const service = this.serviceFactory.createService(serviceType);
    const payment = this.paymentSystemFactory.createPayment();
    const evaluation = this.paymentSystemFactory.createEvaluation();

    service.perform();
    payment.processPayment(service.getPrice());
    const rating = evaluation.evaluate(service);

    console.log(`Service completed with rating: ${rating}`);
  }
}

// ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ
const talentNet = new TalentNet("crypto");
talentNet.orderService("programming");
  

์ด ์ฝ”๋“œ์—์„œ ์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ ํŒฉํ† ๋ฆฌ ํŒจํ„ด๊ณผ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ๋ชจ๋‘ ์‚ฌ์šฉํ–ˆ์–ด์š”. ์„œ๋น„์Šค ์ƒ์„ฑ์—๋Š” ๊ธฐ๋ณธ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„, ๊ฒฐ์ œ ๋ฐ ํ‰๊ฐ€ ์‹œ์Šคํ…œ์—๋Š” ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์ ์šฉํ–ˆ์ฃ . ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‹œ์Šคํ…œ์˜ ๊ฐ ๋ถ€๋ถ„์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๐Ÿ‘จโ€๐Ÿ”ง

๐Ÿ’ก ์‹ค์ „ ์ ์šฉ ์‹œ ์ฃผ์˜ํ•  ์ :

  • ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋ฅผ ์ฃผ์˜ํ•˜์„ธ์š”. ๋•Œ๋กœ๋Š” ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ…์ด ๋” ์ข‹์„ ์ˆ˜ ์žˆ์–ด์š”.
  • ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ๊ฐ์ฒด ์ƒ์„ฑ์— ๊ด€ํ•œ ๊ฒƒ์ด์—์š”. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์ž˜ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ด์š”.
  • ์‹œ์Šคํ…œ์˜ ๋ณต์žก์„ฑ๊ณผ ์œ ์—ฐ์„ฑ ์‚ฌ์ด์˜ ๊ท ํ˜•์„ ์ž˜ ๋งž์ถ”์„ธ์š”.
  • ํ•ญ์ƒ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ คํ•˜์„ธ์š”. ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ๋ชฉ(mock) ๊ฐ์ฒด ์ƒ์„ฑ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค˜์š”.

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ A๋ถ€ํ„ฐ Z๊นŒ์ง€ ๋ชจ๋‘ ์‚ดํŽด๋ดค์–ด์š”. ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•์ธ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด๊นŒ์ง€, ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ์˜ ์ ์šฉ ๋ฐฉ๋ฒ•๊นŒ์ง€ ๋ชจ๋‘ ๋‹ค๋ค˜์ฃ . ๐ŸŽ“

ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜์˜ˆ์š”. ์ด ํŒจํ„ด์„ ๋งˆ์Šคํ„ฐํ•˜๋ฉด ๋” ์œ ์—ฐํ•˜๊ณ , ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ์–ตํ•˜์„ธ์š”, ๋ชจ๋“  ๋„๊ตฌ๊ฐ€ ๊ทธ๋ ‡๋“ฏ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์š”. ๐Ÿ› ๏ธ

์—ฌ๋Ÿฌ๋ถ„์˜ ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ์ƒˆ๋กœ์šด ๋„์ „์ด ์—ฌ๋Ÿฌ๋ถ„์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์–ด์š”! ํ™”์ดํŒ…! ๐Ÿš€๐ŸŒŸ