본문 바로가기

생성 디자인 패턴 - 팩토리 메서드 본문

OOP 디자인 패턴/생성패턴

생성 디자인 패턴 - 팩토리 메서드

개발자로 거듭나기 2023. 4. 22. 17:02
반응형

팩토리 메서드 패턴

  • 가상 생성자, Factory Method 라고도 불립니다.
  • 팩토리 메서드는 부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하지만, 자식 클래스들이 생성될 객체들의 유형을 변경할 수 있도록 하는 생성 패턴입니다.

팩토리 메서드 구성요소

  1. 제품 인터페이스 : 제품 Interface는 그 제품이 수행하는 고유한 operation을 갖고 있습니다.
  2. 제품 생성자 : 팩토리메서드를 추상클래스로 정의하고, someOperation 메서드를 갖고, 내부에서 제품을 만들고 제품과 상호작용 합니다.
  3. 특정 제품 : 제품 Interface를 상속받아서 operation 메서드를구현합니다.
  4. 즉정 제품 생성자 : 특정제품 생성자는 특정 제품에 대한 팩토리 메서드를 구현합니다. 특정제품 생성자 1이면, 특정 제품 1을 생성하는 팩토리 메서드를 구현합니다.
  5. 클라이언트 코드 : 클라이언트 코드는 생성자를 인수로 받고 생성자 클래스의 someOperation 메서드를 호출하여 원하는 제품을 생성할 수 있습니다.

요약

  • 팩토리 메서드 패턴은 제품을 new 키워드를 사용한 직접 호출 보다는 팩토리 메서드를 정의하고, 호출하여 제품을 생성하라고 제안합니다.
  • 제품들을 생성하는 코드를 클라이언트 코드라고 부르고, 클라이언트 코드에서는 제품을 직접 new 키워드를 사용해서 생성하지 않고 팩토리 메서드를 포함하는 생성자 클래스에 위임하여 제품 제작을 맡깁니다.
  • 만약 또 다른 제품이 추가되어야 한다면 class ConcreteCreator3 extends Creator를 정의하고 팩토리 메서드 내부에서 제품3을 생성하는 코드를 추가해서 클라이언트가 ConcreteCreator3을 호출하도록 하게 합니다.

 

반응형

코드

// 제품
interface Product {
  operation(): string;
}

// 제품 생성자
abstract class Creator {
  public abstract factoryMethod(): Product;

  public someOperation(): string {
    // 제품을 만들기 위해 팩토리 메서드를 호출합니다.
    const product = this.factoryMethod();

    // 만들었으면 제품을 사용합니다.
    return `생성자는 제품을 만들고 product.operation() 을 실행합니다. => ${product.operation()}`;
  }
}

// 특정 제품 생성자 2
class ConcreteCreator1 extends Creator {
  public factoryMethod(): Product {
    return new ConcreteProduct1();
  }
}

// 특정 제품 생성자 2
class ConcreteCreator2 extends Creator {
  public factoryMethod(): Product {
    return new ConcreteProduct2();
  }
}

// 특정제품 1
class ConcreteProduct1 implements Product {
  public operation(): string {
    return "저는 제품 1의 어떠한 동작입니다.";
  }
}

// 특정제품 2
class ConcreteProduct2 implements Product {
  public operation(): string {
    return "저는 제품 2의 어떠한 동작입니다.";
  }
}

function clientCode(creator: Creator) {
  // ...
  console.log(
    "Client: 클라이언트 코드는 생성자를 인수로 받고, 특정 생성자는 팩토리 메서드를 이용하여 특정 제품을 제작합니다.."
  );

  // creator은 특정 생성자이고 추상 Creator 클래스에서 상속받은 someOperation 메서드를 실행합니다.
  console.log(`클라이언트 코드 내부 :  ${creator.someOperation()}`);
  // ...
}

console.log("\n\n\n");
console.log(
  "App: 제품 1을 만들겠습니다. ConcreteCreator1은 제품 1를만드는 팩토리 메서드를 갖고있는 클래스 입니다."
);
clientCode(new ConcreteCreator1());
console.log("");

console.log(
  "App: 제품 2을 만들겠습니다. ConcreteCreator2은 제품 2를만드는 팩토리 메서드를 갖고있는 클래스 입니다."
);
clientCode(new ConcreteCreator2());
console.log("\n\n\n");

결과


출처

https://refactoring.guru/ko/design-patterns/factory-method

반응형
Comments