티스토리 뷰

개발/C++

디자인 패턴에 대해 알아보자 - 팩토리 메서드 패턴

부캐: 개발하는 조대리 2024. 9. 26. 03:43
반응형

팩토리 매서드 패턴

 

 

 

 

 

 샘플 소스코드 다운로드

factorymethod_sample.cpp
0.00MB

 

 

 C++ 샘플 소스코드

#include <iostream>
#include <memory>
#include <string>

// 제품 인터페이스
class Vehicle {
public:
    virtual ~Vehicle() = default;
    virtual void drive() const = 0;
};

// 구체적인 제품들
class Car : public Vehicle {
public:
    void drive() const override {
        std::cout << "Car is driving on the road." << std::endl;
    }
};

class Bicycle : public Vehicle {
public:
    void drive() const override {
        std::cout << "Bicycle is riding on the bike lane." << std::endl;
    }
};

// 팩토리 메서드를 포함한 추상 생성자 클래스
class VehicleFactory {
public:
    virtual ~VehicleFactory() = default;
    
    // 팩토리 메서드
    virtual std::unique_ptr<Vehicle> createVehicle() const = 0;
    
    // 공통 로직을 포함한 메서드
    void deliverVehicle() const {
        std::unique_ptr<Vehicle> vehicle = createVehicle();
        std::cout << "Preparing the vehicle..." << std::endl;
        vehicle->drive();
    }
};

// 구체적인 생성자 클래스들
class CarFactory : public VehicleFactory {
public:
    std::unique_ptr<Vehicle> createVehicle() const override {
        return std::make_unique<Car>();
    }
};

class BicycleFactory : public VehicleFactory {
public:
    std::unique_ptr<Vehicle> createVehicle() const override {
        return std::make_unique<Bicycle>();
    }
};

// 클라이언트 코드
void clientCode(const VehicleFactory& factory) {
    factory.deliverVehicle();
}

int main() {
    std::cout << "Client: Testing CarFactory\n";
    CarFactory carFactory;
    clientCode(carFactory);
    
    std::cout << "\nClient: Testing BicycleFactory\n";
    BicycleFactory bicycleFactory;
    clientCode(bicycleFactory);

    return 0;
}

 

 

 

 구현에 대한 설명

  1. 추상화: Vehicle은 추상 기본 클래스로, 모든 구체적인 제품(Car, Bicycle)이 구현해야 하는 인터페이스를 정의합니다.
  2. 팩토리 메서드: VehicleFactory 클래스의 createVehicle() 메서드가 팩토리 메서드입니다. 이 메서드는 순수 가상 함수로 선언되어 하위 클래스에서 반드시 구현해야 합니다.
  3. 구체적인 팩토리: CarFactory와 BicycleFactory는 VehicleFactory를 상속받아 구체적인 Vehicle 객체를 생성합니다.
  4. 공통 로직: VehicleFactory의 deliverVehicle() 메서드는 공통 로직을 포함하며, 팩토리 메서드를 사용하여 객체를 생성합니다.
  5. 스마트 포인터 사용: std::unique_ptr을 사용하여 메모리 관리를 자동화하고 리소스 누수를 방지합니다.
  6. 개방-폐쇄 원칙: 새로운 종류의 Vehicle을 추가할 때 기존 코드를 수정하지 않고 새로운 클래스를 추가할 수 있습니다.
  7. 의존성 역전: 클라이언트 코드는 구체적인 클래스가 아닌 추상 인터페이스에 의존합니다.

 

 

 

 이 구현 방식의 장점

  • 객체 생성 로직을 캡슐화하여 클라이언트 코드와 분리합니다.
  • 새로운 제품 유형을 쉽게 추가할 수 있어 확장성이 좋습니다.
  • 코드 재사용성이 높아집니다.

 

 

 

 주의할 점

  • 제품 종류가 많아지면 클래스 수가 증가할 수 있습니다.
  • 간단한 경우에는 과도한 복잡성을 초래할 수 있습니다.

 

 

 


 

개인적으로 학습하면서 정리한 내용입니다.

잘못된 내용이 있을 경우 알려주시면 확인 후 수정 및 반영하도록 하겠습니다.