객체의 생성과 구현을 분리할 수 있음
더 많은 유연성과 제어력을 제공
객체의 생성자를 노출시키지 않고 객체를 확장하거나 수정하지 못하도록 함
const createImage = (value) => { if (value.includes('.jpg')) { return new JpgImage(value) } else if (value.includes('.gif')) { return new GifImage(value) } else if (value.includes('.png')) { return new PngImage(value) } else { throw new Error('일치하는 확장자가 없습니다.') } }
JavaScript에서는 private 변수가 없음
그러므로 클로저를 통해 캡슐화
const createPerson = (name) => { const privateProperties = {} const person = { setName: (name) => { if (!name) { throw new Error('이름이 필요합니다') } privateProperties.name = name }, getName: () => { return privateProperties.name }, } person.setName(name) return person }
팩토리에 의해 반환되는 공용 인터페이스인 person 객체는 외부에서 접근 불가하고, person 객체가 제공하는 privateProperties를 통해서만 조작할 수 있음