추상팩토리 패턴(Abstract Factory Pattern)
디자인패턴 공부하기
  • JavaScript

여러가지 디자인 패턴에 대해 정리해보고자 합니다.
첫 번째로 추상팩토리 패턴에 대해 작성해보겠습니다.

추상팩토리 패턴(Abstract Factory Pattern)

구체적인 클래스에 의존하지 않고, 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴
관련성 있는 여러 종류의 객체를 일관된 방식으로 생성할 때 유용합니다.

ㄴ 간단한 예제를 통해 이해해봅니다.

지금 글을 작성하고있는 이 곳이 카페이기 때문에 커피를 예로 들어보고자 합니다.

const coffeeFactory = (function() {
  const types = {};
  return {
    addType: function(type, Coffee) {
      if (Coffee.property.order) {
        types[type] = Coffee;
      }
    },
    create: function(type, options) {
      const Coffee = types[type];
      return (Coffee ? new Coffee(options) : undefined);
    }
  }
})

const Coffee = (function() {
  function Coffee(options) {
    this.name = options.name;
    this.price = options.price;
  }
  
  Coffee.prototype.order = function() {
    console.log(`${this.name}${price}에 주문합니다`);
  }
  
  Coffee.prototype.orderCancel = function(reason) {
    console.log(`${this.name}${reason}의 사유로 주문을 취소합니다. ${this.price}를 환불합니다.`);
  }
})

이렇게 coffeeFactoryCoffee 2개의 객체를 이용하여 무제한의 커피종류를 생성할 수 있습니다.

coffeeFactory.addType('Ameracano', Coffee);
coffeeFactory.addType('ColdBrew', Coffee);
coffeeFactory.addType('Latte', Coffee);

이렇게 생성하고,

const IceAmeracano = coffeeFactory.create('Ameracano', { name: 'Ice Americano', price: 3500 });
const HotAmeracano = coffeeFactory.create('Ameracano', { name: 'Hot Americano', price: 3000 });
const BanilaColdBrew = coffeeFactory.create('ColdBrew', { name: 'Banila Cold Brew', price: 4000 });
const ChocoColdBrew = coffeeFactory.create('ColdBrew', { name: 'Choco Cold Brew', price: 4500 });

IceAmeracano.order(); // Ice Americano를 3500원에 주문합니다.
BanilaColdBrew.order(); // Banila Cold Brew를 4000원에 주문합니다.
BanilaColdBrew.orderCancel('변심'); // Banila Cold Brew를 변심의 사유로 주문을 취소합니다. 4000를 환불합니다.

추상 팩토리에서 팩토리 라는 이름처럼 공장에서 필요한만큼 객체를 찍어내면 됩니다. Coffee종류를 추가할 수도 있고,
해당 재료를 사용하여 만드는 여러가지 음료도 마음껏 생성이 가능합니다.