Factory 패턴

팩토리 패턴을 사용하면 함수를 호출하는 것으로 객체를 만들어낼 수 있다. 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',
})

참조