[바미] Factory 패턴
Factory 패턴
객체를 생성하는 팩토리 함수를 사용한다.
📜 원문: patterns.dev - factory pattern
📜 번역: https://patterns-dev-kr.github.io/design-patterns/factory-pattern/
팩토리 패턴을 사용하면 함수를 호출하는 것으로 객체를 만들어낼 수 있습니다.
new 키워드를 사용하는 대신 함수 호출의 결과로 객체를 만들 수 있는 것이죠.
앱에 다수의 사용자를 추가해야 한다고 가정해 보겠습니다. 사용자는 firstName, lastName, email 속성을 갖게 됩니다.
이 때 팩토리 함수를 사용해 fullName 메서드를 가진 객체를 만들어 반환합니다.
const createUser = ({ firstName, lastName, email }) => ({
firstName,
lastName,
email,
fullName() {
return `${this.firstName} ${this.lastName}`
},
})
아래 예제에서는 위에서 만든 createUser 팩토리 함수를 사용하고 있습니다.
팩토리 패턴은 상대적으로 복잡한 객체 혹은 환경이나 설정에 따라 키와 값을 다양하게 설정해야 하는 객체를 만들어야 할 때 유용하게
사용할 수 있습니다. 팩토리 패턴을 사용해 특정한 키나 값을 가진 객체를 쉽게 만들 수 있죠.
const createObjectFromArray = ([key, value]) => ({
[key]: value,
})
createObjectFromArray(['name', 'John']) // { name: "John" }
장점
팩토리 패턴은 동일한 프로퍼티를 가진 여러 작은 객체를 만들어낼 때 유용합니다.
현재의 환경이나 사용자 특징적인 설정을 통해 원하는 객체를 쉽게 만들 수 있습니다,
단점
자바스크립트에서 팩토리 함수는 new 키워드 없이 객체를 만드는 것에서 크게 벗어나지 않습니다.
ES6의 화살표 함수를 이용하면 간결하게 작은 팩토리 함수를 만들 수 있습니다.
하지만 대부분의 상황에서 객체를 일일히 만드는 것 보다 클래스를 활용하는 편이 메모리를 절약하는데 더 효과적이죠.
class User {
constructor(firstName, lastName, email) {
this.firstName = firstName
this.lastName = lastName
this.email = email
}
fullName() {
return `${this.firstName} ${this.lastName}`
}
}
const user1 = new User({
firstName: 'John',
lastName: 'Doe',
email: 'john@doe.com',
})
const user2 = new User({
firstName: 'Jane',
lastName: 'Doe',
email: 'jane@doe.com',
})
참조
- JavaScript Factory Functions with ES6+ - Eric Elliott