개발/Javascript(Typescript)

[디자인 패턴] 팩토리 패턴

piece5 2023. 8. 9. 22:51

출처

https://www.youtube.com/watch?v=kuirGzhGhyw

https://yceffort.kr/2021/01/nodejs-4-design-pattern#%ED%8C%A9%ED%86%A0%EB%A6%AC

https://devmoony.tistory.com/43 


팩토리 패턴이란?

객체를 생성하는데 사용되는 인터페이스 또는 추상 클래스를 정의 하는 것이다. 

각 클래스 인스턴스를 각각 만드는 대신에 비슷한 클래스 모아서 조건에 따라 인스턴스를 생성한다.

인스턴스 생성과 관련된 모든 코드가 한 곳(팩토리)에 있으므로 코드를 더 잘 꾸밀 수 있다.

function createImage(name){
  if(name.match(/\.jpeg$/)){
    return new JpegImage(name);
  }else if(name.match(/\.gif$/)){
    return new GifImage(name);
  }else if(name.match(/\.png$/)){
    return new PngImage(name);
  }else{
    throw new Exception('Unsupported format');
  }
}
import Motorvehicle from './Motorvehicle'
import Aircraft from './Aircraf'
import Railvehicle from './Railvehicle'

const VehicleFactory = (type, make, model, year) => {
  if (type === car) {
    return new Motorvehicle('car', make, model, year)
  } else if (type === airplane) {
    return new Aircraft('airplane', make, model, year)
  } else if (type === helicopter) {
    return new Aircraft('helicopter', make, model, year)
  } else {
    return new Railvehicle('train', make, model, year)
  }
}

module.exports = VehicleFactory
function Developer(name) 
{
  this.name = name;
  this.type = "Developer";
}

function Tester(name)
{
  this.name = name;
  this.type = "Tester";
}

function EmployeeFactory()
{
  this.create = (name, type) => {
    switch(type)
      {
        case 1:
          return new Developer(name);
          break;
        case 2:
          return new Tester(name);
          break;
      }
  }
}

function say()
{
  console.log("Hi, I am " + this.name + " and I am a " + this.type);
}
const employeeFactory = new EmployeeFactory();
const employees = [];

employees.push(employeeFactory.create("Patrick",1));
employees.push(employeeFactory.create("John",2));

employees.forEach(e => {
  say.call(e);
})