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μ κΈμ μ½μΌλ©΄ λ©λλ€.