[230912] 팩토리 패턴

팩토리 패턴

  • 객체 생성 과정이 복잡하거나, 객체 생성을 중앙에서 관리하고자 할 떄 사용

1. Simple Factory Pattern

  • 하나의 팩토리 클래스가 여러 종류의 객체를 생성
  • 객체 생성 로직을 캡슐화하고, 클라이언트 코드에서 직접 객체 생성을 처리하지 않음
// 도형 클래스
class Circle {
  constructor(radius) {
    this.radius = radius;
  }

  area() {
    return Math.PI * this.radius * this.radius;
  }
}

class Square {
  constructor(side) {
    this.side = side;
  }

  area() {
    return this.side * this.side;
  }
}

class Triangle {
  constructor(base, height) {
    this.base = base;
    this.height = height;
  }

  area() {
    return (this.base * this.height) / 2;
  }
}

// 팩토리 클래스
class ShapeFactory {
  createShape(shapeType, ...args) {
    switch (shapeType.toLowerCase()) {
      case "circle":
        return new Circle(...args);
      case "square":
        return new Square(...args);
      case "triangle":
        return new Triangle(...args);
      default:
        throw new Error("Invalid shape type");
    }
  }
}

// 클라이언트 코드
const factory = new ShapeFactory();

const circle = factory.createShape("circle", 5);
console.log(`Circle Area: ${circle.area()}`); // "Circle Area: 78.53981633974483"

const square = factory.createShape("square", 4);
console.log(`Square Area: ${square.area()}`); // "Square Area: 16"

const triangle = factory.createShape("triangle", 6, 8);
console.log(`Triangle Area: ${triangle.area()}`); // "Triangle Area: 24"

2. Factory Method Pattern

  • 객체 생성을 서브 클래스로 위임
  • 슈퍼 클래스에 추상 팩토리 메서드가 선언되어 있고, 각 서브에서 해당 메서드를 구현하여 서브 클래스에 특화된 객체를 생성함
  • 다양한 객체 유형을 생성하고, 확장할때 강력한 방법
// 도형 인터페이스 (Product)
class Shape {
  draw() {
    throw new Error("This method should be overridden in concrete shapes.");
  }
}

// 구체적인 도형 클래스들 (Concrete Products)
class Circle extends Shape {
  draw() {
    return "Circle is drawn";
  }
}

class Square extends Shape {
  draw() {
    return "Square is drawn";
  }
}

class Triangle extends Shape {
  draw() {
    return "Triangle is drawn";
  }
}

// 팩토리 메서드 패턴을 구현한 팩토리 클래스 (Creator)
class ShapeFactory {
  createShape(shapeType) {
    switch (shapeType) {
      case "circle":
        return new Circle();
      case "square":
        return new Square();
      case "triangle":
        return new Triangle();
      default:
        throw new Error("Invalid shape type");
    }
  }
}

// 클라이언트 코드
const factory = new ShapeFactory();

const circle = factory.createShape("circle");
console.log(circle.draw()); // "Circle is drawn"

const square = factory.createShape("square");
console.log(square.draw()); // "Square is drawn"

const triangle = factory.createShape("triangle");
console.log(triangle.draw()); // "Triangle is drawn"

Categories:

Updated:

Leave a comment