Bami 2022. 10. 6. 07:43
728x90
반응형

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',
})
 
 
728x90
반응형