디자인 패턴 3. Factory Pattern, 팩토리 패턴

디자인 패턴

팩토리 패턴이란?

객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화하는 패턴이자 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴이다.

장점

  • 상위 클래스와 하위 클래스가 분리되어 느슨한 결합을 가지지만 상위 클래스에서는 인스턴스 생성 방식에 대해 전혀 알 필요가 없기 때문에 많은 유연성을 갖게 된다.
  • 객체 생성 로직이 따로 떼어져 있기 때문에 코드 리팩토링 하더라도 한 곳만 고칠 수 있게 되니 유지 보수성이 증가한다.

팩토리 패턴 예제

function Person(name) { this.name = name this.introduce = function() { return 'My name is' + this.name } } // name 프로퍼티와 introduce 메소드를 미리 초기화한 객체를 리턴합니다. var user1 = new Person('godori') var user2 = new Person('irodog') user1.introduce() // My name is godori user2.introduce() // My name is irodog

팩토리 패턴 응용 JavaScript Factory Function

예제 1

class Animal { speak() {} } class Cat extends Animal { speak() { console.log("meow!"); } } class Dog extends Animal { speak() { console.log("wang!"); } } class FactoryAnimal { creatAnimal(type) { if(type =='cat') return new Cat() if(type =='dog') return new dog() } } cat = FactoryAnimal.creatAnimal('cat') cat.speak() // meow! dog = FactoryAnimal.creatAnimal('dog') dog.speak() // wang!

예제 2

class Car{ constructor(info){ this.name = info.name; this.price = info.price; } getInfo(){ return this.name+"의 가격은 "+this.price+" 입니다."; } static factory(name){ if(name === "Avante"){ return new Avante(); }else if(name === "Sonata"){ return new Sonata(); } } } class Sonata extends Car{ constructor(){ super({name: "쏘나타", price: "2,386 ~ 3,367만원"}); } } class Avante extends Car{ constructor(){ super({name: "아반테", price: "1,570 ~ 2,453만원"}); } } const avante = Car.factory("Avante"); const sonata = Car.factory("Sonata"); avante.getInfo() // 아반테의 가격은 "1,570 ~ 2,453만원" 입니다. sonata.getInfo()// 쏘나타의 가격은 "2,386 ~ 3,367만원" 입니다."

예제 3

class CafeLatte { constructor() { this.price = 3000; } getPrice() { return this.price; } } class CaramelLatte { constructor() { this.price = 5000; } getPrice() { return this.price; } } class LatteFactory() { static create(latteType) { if(latteType === 'cafe') { return new CafeLatte(); } else if(latteType === 'caramel') { return new CaramelLatte(); } } } let latte = LatteFactory.create('caramel'); latte.getPrice(); // 5000
JP
이중표Frontend Engineer

3년차 프론트엔드 개발자. Next.js, React, TypeScript 기반 웹 애플리케이션 개발 전문. 대규모 트래픽 환경에서 SSR·ISR 렌더링 전략 설계 경험.

이력서 보기