본문 바로가기
디자인패턴

디자인패턴 - 팩토리 메서드 패턴, 추상 팩토리 패턴

by KBS 2024. 2. 16.
728x90

팩토리 메서드 패턴

팩토리 패턴은 객체 생성을 추상화하여 클라이언트가 객체를 직접 생성하지 않고 팩토리에 요청하여 객체를 얻는 디자인 패턴입니다

팩토리 메서드 패턴은 객체 생성을 서브 클래스에 위임하여 객체 생성을 캡슐화하는 디자인 패턴입니다.

  • 목적 : 단일 객체의 생성을 위해 사용됩니다. 서브 클래스에서 구현되는 팩토리 메서드를 통해 객체를 생성합니다.
// 차량 인터페이스
interface Vehicle {
  drive(): void;
}

// 차량 생성을 위한 추상 팩토리 클래스
abstract class VehicleFactory {
  // 팩토리 메서드
  abstract createVehicle(): Vehicle;

  // 차량을 사용하는 클라이언트
  useVehicle() {
    const vehicle = this.createVehicle();
    console.log("새로운 차량을 생성했습니다.");
    vehicle.drive();
  }
}

// 자전거 클래스
class Bicycle implements Vehicle {
  drive() {
    console.log("자전거를 타고 이동합니다.");
  }
}

// 자동차 클래스
class Car implements Vehicle {
  drive() {
    console.log("자동차를 운전합니다.");
  }
}

// 자전거 팩토리 클래스
class BicycleFactory extends VehicleFactory {
  // 자전거 생성 메서드
  createVehicle() {
    return new Bicycle();
  }
}

// 자동차 팩토리 클래스
class CarFactory extends VehicleFactory {
  // 자동차 생성 메서드
  createVehicle() {
    return new Car();
  }
}

// 사용 예제
const bicycleFactory = new BicycleFactory();
bicycleFactory.useVehicle(); // 새로운 차량을 생성했습니다. 자전거를 타고 이동합니다.

const carFactory = new CarFactory();
carFactory.useVehicle(); // 새로운 차량을 생성했습니다. 자동차를 운전합니다.

차량을 생성하기 위한 VehicleFactory 추상 클래스를 정의하고, 이를 상속하여 자전거와 자동차를 생성하는 구체적인 팩토리 클래스인 BicycleFactoryCarFactory를 구현했습니다.

각 팩토리 클래스에서는 추상 팩토리 메서드인 createVehicle를 구현하여 실제로 어떤 종류의 차량을 생성할지 결정합니다. 클라이언트는 팩토리 객체를 생성한 후 useVehicle메서드를 호출하여 새로운 차량을 생성하고 운전합니다. 이렇게 함으로써 객체 생성을 팩토리 클래스에 위임하여 객체 생성의 책임을 분리하고, 확장성과 유연성을 확보할 수 있습니다.

추상 팩토리 패턴

여러 종류의 관련된 객체들의 생성을 위해 사용됩니다. 추상 팩토리는 관련된 객체들의 팩토리들을 생성하며, 각 팩토리는 서로 다른 종류의 관련된 객체들을 생성합니다.

추상 팩토리 인터페이스를 정의하고, 이를 구현하는 여러 개의 팩토리 클래스를 생성합니다. 각 팩토리 클래스는 관련된 객체들을 생성하는 메서드를 제공합니다.

// 추상 팩토리 인터페이스
interface GUIFactory {
  createButton(): Button;
  createTextBox(): TextBox;
}

// 추상 팩토리에서 생성될 버튼 인터페이스
interface Button {
  render(): void;
}

// 추상 팩토리에서 생성될 텍스트 상자 인터페이스
interface TextBox {
  render(): void;
}

// 각 플랫폼에 따른 구체적인 버튼 클래스
class WindowsButton implements Button {
  render() {
    console.log("Windows 스타일의 버튼을 렌더링합니다.");
  }
}

class MacOSButton implements Button {
  render() {
    console.log("MacOS 스타일의 버튼을 렌더링합니다.");
  }
}

// 각 플랫폼에 따른 구체적인 텍스트 상자 클래스
class WindowsTextBox implements TextBox {
  render() {
    console.log("Windows 스타일의 텍스트 상자를 렌더링합니다.");
  }
}

class MacOSTextBox implements TextBox {
  render() {
    console.log("MacOS 스타일의 텍스트 상자를 렌더링합니다.");
  }
}

// Windows 플랫폼용 GUI 팩토리
class WindowsGUIFactory implements GUIFactory {
  createButton(): Button {
    return new WindowsButton();
  }

  createTextBox(): TextBox {
    return new WindowsTextBox();
  }
}

// MacOS 플랫폼용 GUI 팩토리
class MacOSGUIFactory implements GUIFactory {
  createButton(): Button {
    return new MacOSButton();
  }

  createTextBox(): TextBox {
    return new MacOSTextBox();
  }
}

// 클라이언트 코드
function runApp(factory: GUIFactory) {
  const button = factory.createButton();
  const textBox = factory.createTextBox();

  button.render();
  textBox.render();
}

// Windows 플랫폼에서 실행
console.log("Windows 플랫폼에서 애플리케이션을 실행합니다.");
runApp(new WindowsGUIFactory());

// MacOS 플랫폼에서 실행
console.log("MacOS 플랫폼에서 애플리케이션을 실행합니다.");
runApp(new MacOSGUIFactory());

 

위의 코드에서는 추상 팩토리 패턴을 사용하여 여러 플랫폼에 따라 서로 다른 스타일의 버튼과 텍스트 상자를 생성합니다. GUIFactory 인터페이스는 버튼과 텍스트 상자를 생성하는 추상 메서드를 정의하고, 각 플랫폼에 대한 구체적인 팩토리 클래스는 이 인터페이스를 구현합니다.

클라이언트는 원하는 플랫폼에 따라 적절한 팩토리를 생성하여 애플리케이션을 실행할 수 있습니다. 이렇게 함으로써 클라이언트 코드는 구체적인 클래스와 강하게 결합되지 않고, 다양한 플랫폼을 지원하는 유연한 코드를 작성할 수 있습니다.

차이점

팩토리 메서드 패턴은 단일 객체의 생성에 중점을 두며, 서브 클래스에서 객체 생성 방법을 변경할 수 있는 유연성을 제공합니다. 반면에 추상 팩토리 패턴은 관련된 객체들의 그룹을 생성하고, 다중 객체 생성에 대한 유연성을 제공합니다.

728x90

'디자인패턴' 카테고리의 다른 글

디자인패턴 - 프록시 패턴  (0) 2024.02.18
디자인패턴 - 어댑터 패턴  (0) 2024.02.18
디자인패턴 - 퍼사드패턴  (0) 2024.02.17
디자인패턴 - 싱글톤(Singleton) 패턴  (1) 2024.02.15
디자인 패턴  (0) 2024.02.15

댓글