Understand the Factory Design Pattern in plain JavaScript - Lee-hyuna/33-js-concepts-kr GitHub Wiki

순수 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ νŒ©ν† λ¦¬ λ””μžμΈ νŒ¨ν„΄μ˜ 이해

μš©μ–΄ 사전 μ •μ˜ (영->ν•œ)


  • Javascript : μžλ°”μŠ€ν¬λ¦½νŠΈ
  • plain : λ‹¨μ‘°λ‘œμš΄, 뽐내지 μ•ŠλŠ”μ™€ 같은 λœ»μ„ μ§€λ‹ˆκ³  μžˆμ–΄ 순수둜 λ²ˆμ—­
  • Factory Design Pattern : νŒ©ν† λ¦¬λ””μžμΈνŒ¨ν„΄
  • interpreter : 인터프리터
  • cumbersome : μ„±κ°€μ‹ , λΆ€λ‹΄μŠ€λŸ¬μš΄
  • object : 객체
  • In a nutshell : κ°„λ‹¨νžˆ 말해
  • instance : μΈμŠ€ν„΄μŠ€
  • function : ν•¨μˆ˜
  • keyword : ν‚€μ›Œλ“œ
  • Mixin : 믹슀인

ν”„λ‘œν†  νƒ€μž… 상속을 κ΅¬ν˜„ ν•˜κΈ° μœ„ν•΄ 일반적으둜 μ•„λž˜μ™€ 같은 λ°©λ²•μœΌλ‘œ μž‘μ„±ν•©λ‹ˆλ‹€.

const Animal = function(name) {
  this.name = name;
}
Animal.prototype.walk = function() {
  console.log(this.name + " walks");
}

κ·ΈλŸ¬κ³ λ‚˜μ„œ μš°λ¦¬λŠ” μ•„λž˜μ˜ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ—¬ μ‚¬μš©ν•©λ‹ˆλ‹€.

poo = new Animal("poo")
tommy = new Animal("tommy")
poo.walk()
tommy.walk()

μœ„μ™€ 같은 방법은 λͺ‡κ°€μ§€ λ¬Έμ œμ μ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€. ν•œκ°€μ§€λŠ” κ°œλ°œν•˜λŠ” λ™μ•ˆμ— new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것을 잊게 되고 μΈν„°ν”„λ¦¬ν„°λŠ” ν•΄μ„ν•˜μ§€ μ•Šμ•„μ„œ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. this λ©”μ„œλ“œλ‘œ 상속을 κ΅¬ν˜„ν•˜λŠ” 것 λΆ€λ‹΄μŠ€λŸ¬μš΄ μΌμž…λ‹ˆλ‹€. 그리고 this와 ν•¨κ»˜ 이 문제λ₯Ό ν•΄κ²°ν•˜λ € ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

ν•œ 가지 λ‹€λ₯Έ 방법은 객체λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

const Animal = {
  name: "not_given_yet", //remove this if you like
  walk() {
    console.log(this.name + " walks");
  }
}
const poo = Object.assign({}, Animal, {name: "poo"})
poo.walk()
or
const tommy = Object.create(Animal) //this sets up prototype chain
tommy.name = "tommy"
tommy.walk()

ν•˜μ§€λ§Œ νŒ©ν† λ¦¬ λ””μžμΈ νŒ¨ν„΄μ΄λΌ λΆˆλ¦¬μš°λŠ” λ‹€λ₯Έ νŒ¨ν„΄μ„ μ„ ν˜Έν•©λ‹ˆλ‹€.

κ°„λ‹¨νžˆ 말해, ν•¨μˆ˜ λ‚΄μ—μ„œ μΈμŠ€ν„΄μŠ€ 생성을 κ΅¬ν˜„ν•˜κ³ , μ‚¬μš©μžλ₯Ό Object.create λ˜λŠ” new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•  ν•„μš”κ°€ μ—†λŠ” 경우 νŒ©ν† λ¦¬λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

μ’€ 더 μƒμ„Ένžˆ μ„€λͺ…ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

νŒ©ν† λ¦¬ λ””μžμΈ νŒ¨ν„΄

const Animal = function(name){
    const animal = {};
    animal.name = name;
    animal.walk = function(){
        console.log(this.name + " walks");
    }
    return animal;
};

μœ„μ˜ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³ λ‚˜λ©΄, μ•„λž˜μ˜ μ½”λ“œμ—μ„œ 처럼 μ‚¬μš©ν•©λ‹ˆλ‹€.

const poo = Animal("poo");
const tommy = Animal("tommy");
poo.walk() // poo walks
tommy.walk() // tommy walks

λ³΄μ‹œλ‹€μ‹œν”Ό Animal ν•¨μˆ˜κ°€ 호좜이 되고, 두 번 λͺ¨λ‘ μƒˆλ‘œμš΄ animal μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ animal은 ν•¨μˆ˜μ μœΌλ‘œλŠ” μ œν•œμ΄ μžˆμŠ΅λ‹ˆλ‹€. poo, tommy μΈμŠ€ν„΄μŠ€λŠ” λ‹Ήμž₯ walk ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 animal의 μΈμŠ€ν„΄μŠ€λ“€μ— ν•¨μˆ˜λ₯Ό μΆ”κ°€ν•˜λ €λ©΄ 무엇을 ν•΄μ•Ό ν• κΉŒμš”?

λ―ΉμŠ€μΈμ„ μ‚¬μš©ν•˜μž

ν•¨μˆ˜λ₯Ό 더 μΆ”κ°€ν•˜κΈ° μœ„ν•΄ λ―ΉμŠ€μΈμ„ μ‚¬μš©ν•©λ‹ˆλ‹€. λ―ΉμŠ€μΈμ€ 자체적으둜 μƒνƒœκ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ§€λ§Œ, μ•„λž˜μ˜ μ½”λ“œμ—μ„œ 객체에 λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜λŠ” 방법은 쒋은 방법 μž…λ‹ˆλ‹€.

const canKill = {
  kill() {
    console.log("I can kill")
  }
}

이제 kill ν•¨μˆ˜κ°€ μΆ”κ°€ 됨으둜써, animal은 kill ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

k1 = Object.assign(Animal("k1"), canKill)

κ·ΈλŸ¬λ‚˜ μš°λ¦¬λŠ” μ—¬λŸ¬λ²ˆ canKillμ΄λΌλŠ” ν•¨μˆ˜λ₯Ό ν•„μš”λ‘œ ν•œλ‹€λ©΄, μ•„λž˜μ˜ μ½”λ“œμ—μ„œ 처럼 이λ₯Ό μœ„ν•œ νŒ©ν† λ¦¬λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.

const KillingAnimal = function(name) {
  const animal = Animal(name)
  const killingAnimal = Object.assign(animal, canKill)
  return killingAnimal;
}

μ•„λž˜μ™€ 같은 λ°©λ²•μœΌλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.

k2 = KillingAnimal("k2")
monty = KillingAnimal("monty")
k2.kill()
k2.walk()

예λ₯Ό λ“€μ–΄ μ—¬λŸ¬κ°œμ˜ λ―ΉμŠ€μΈμ„ ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

const canFly = {
  fly(h) {
    console.log("I can fly " + h "meters high")
  }
}
const canDance = {
  dance() {
    console.log("Look Maa !! I'm dancing")
  }
}
brian = Object.assign(Animal("brian"), canKill, canFly, canDance)
brian.walk()
brian.fly(200)
brian.kill()
brian.dance()

두가지 νŒ©ν† λ¦¬λ₯Ό ν•©μΉ  수 μžˆμŠ΅λ‹ˆλ‹€.

Animal νŒ©ν† λ¦¬λ₯Ό μ œμ™Έν•˜κ³ , Robot νŒ©ν† λ¦¬κ°€ μžˆλ‹€κ³  κ°€μ •ν•΄λ΄…μ‹œλ‹€.

const Robot = function(name) {
  const robot = {}
  robot.name = name;
  robot.speak = function(message) {
    console.log(robot.name + " speaks " + message)
  }
  return robot;
}

λ§Žμ€ λ‘œλ΄‡μ„ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ Animal Robot을 ν•„μš”λ‘œ ν•©λ‹ˆλ‹€. animal, robot을 μ–»κΈ° μœ„ν•΄ 두가지 νŒ©ν† λ¦¬λ₯Ό ν•©μΉ˜λŠ” 것은 λ¬Έμ œκ°€ μ—†μŠ΅λ‹ˆλ‹€.

roboDog = Object.assign(Animal("roboDog"), Robot("roboDog"))

λ§Œμ•½ robotDogκ°€ canKill을 ν•„μš”λ‘œ ν•œλ‹€λ©΄ μ•„λž˜μ™€ 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.

killingRoboDog = Object.assign({}, roboDog, canKill)
killingRoboDog.walk()
killingRoboDog.kill()
killingRoboDog.speak("roboDog will kill you")

Animal Robot이 ν•„μš”λ‘œ ν•œλ‹€λ©΄, 이전에 λ‘œλ΄‡ νŒ©ν† λ¦¬λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

μΆ©λΆ„νžˆ μ΄ν•΄ν•˜κΈΈ μ›ν•˜κ³  있고, 문의 사항, 의견이 있으면 있으면 λŒ“κΈ€λ‘œ λ‹¬μ•„μ£Όμ„Έμš”.

νŒ©ν† λ¦¬μ— λŒ€ν•΄μ„œ 더 μžμ„Ένžˆ μ•Œκ³  μ‹Άλ‹€λ©΄,Eric Elliott의 글을 읽으면 λ©λ‹ˆλ‹€.

⚠️ **GitHub.com Fallback** ⚠️