팩토리 패턴

홍범선·2023년 10월 13일
0

디자인패턴

목록 보기
2/4

팩토리 패턴

생성자 카테고리에 속한다.

다수에 또 다른 종류들의 오브젝트 나 클래스가 있다고 했을 때 이것들을 이제 좀 더 효율적으로 생성할 수 있도록 도와주는 패턴이다. 일일이 각각의 생성자 함수를 호출해서 생성하는 것이 아니라 하나의 인터페이스를 통해서 여러가지 다른 종류의 오브젝트를 찍어내는 것이다. 실무에서 많이 사용한다.

비슷한 객체를 공장 라인에서 반복적으로 생성할 수 있게 하는 개념과 비슷하다라고 해서 네이밍 된 것이다.

api에서 데이터를 fetching 하고 그 결과에 따라서 동적으로 무언가를 구현해야 할 때 특히 반복적으로 무언가를 만들어 내야 될 때 많으 쓰이는 패턴이다.

신발공장은 직접적으로 제조공정(Nike Puma, Vans 등) 일체 개입하지 않는다.
만약 주문서로 공정이 시작되면 이 팩토리(공장)에서 제각각 파이프 라인으로 새 주문을 보내는 걸 위임을 한다.
1. 팩토리 인터페이스는 새로운 오브젝트를 생성하고 리턴을 하는 일을 위임에서 한다. 신발 공정에서 조건로직이 필요하는데 어느 공정으로 보낼지 구현해야 한다.

생성자 패턴 중에서 가장 기본이 되는 패턴이다.
클래스 객체 생성 처리를 팩토리 인터페이스 또는 팩토리 클래스를 통해서 위임하여 처리한다. 팩토리 클래스는 조건 로직이 필요하다. 그 조건 로직에 따라 어떤 객체를 생성할지 결정 한다. 팩토리 패턴의 특성상 클래스의 의존도가 낮다. 그래서 확장이 쉽고 유지보수가 용이하다.

class Shoe{
  constructor(attrs){
    this._attrs = attrs || {};
  }
  getName() {
    return this._attrs?.name;
  }
  getSize() {
    return this._attrs?.size;
  }
  getBrand() {
    return this.constructor.name;
  }
}

class Nike extends Shoe{}
class Puma extends Shoe{}
class Adidas extends Shoe{}

const data = [
  {type : "Nike", attrs : { name:'SB', size:300}},
  {type : "Nike", attrs : { name:'Airforce', size:240}},
  {type : "Puma", attrs : { name:'Jada', size:270}},
  {type : "Nike", attrs : { name:'Cortez', size:265}},
  {type : "Adidas", attrs : { name:'Super Star', size:290}}
]

class ShoeFactory{
  typeMap = {
    nike : Nike,
    puma : Puma,
    adidas : Adidas,
  }
  create(props){
    try{
      const Brand = this.typeMap[props?.type?.toLowerCase()];
      return new Brand(props.attrs);
    }catch(e){
      console.log(e)
    }
  }
}

const factory = new ShoeFactory()
const nike1 = factory.create({
  type:"Nike",
  attrs: {name: "Cortez", size:265},
});

// console.log(nike1);
// console.log(nike1.getBrand());
// console.log(nike1.getSize());

const items = data.map((item) => factory.create(item));
console.log(items);
profile
알고리즘 정리 블로그입니다.

0개의 댓글