티스토리 뷰

개발/디자인 패턴

Factory

-=HaeJuK=- 2024. 3. 4. 21:36
반응형

팩토리 패턴은 객체 생성을 위한 인터페이스를 정의하고, 하위 클래스가 어떤 클래스의 인스턴스를 생성할지 결정하게 하는 디자인 패턴입니다. 이를 통해 객체 생성을 서브클래스에 위임함으로써, 클라이언트 코드와 인스턴스를 만들어야 하는 구체적인 클래스 간의 결합도를 낮출 수 있습니다.

팩토리 패턴은 크게 두 가지로 나뉩니다:

팩토리 메서드 패턴추상 팩토리 패턴입니다. 여기서는 더 간단한 팩토리 메서드 패턴의 예제를 소개하겠습니다.

팩토리 메서드 패턴 예제

이 예제에서는 단순한 차량 공장을 모델링합니다. Vehicle 인터페이스와 이를 구현하는 두 개의 구체 클래스 Car와 Bike를 정의합니다. 그리고 VehicleFactory 클래스에서는 Vehicle 객체를 생성하는 팩토리 메서드 createVehicle을 제공합니다.

 

#include <iostream>
#include <memory>

// Vehicle 인터페이스 정의
class Vehicle {
public:
    virtual void info() = 0;
    virtual ~Vehicle() {}
};

// Car 클래스 정의
class Car : public Vehicle {
public:
    void info() override {
        std::cout << "I am a Car." << std::endl;
    }
};

// Bike 클래스 정의
class Bike : public Vehicle {
public:
    void info() override {
        std::cout << "I am a Bike." << std::endl;
    }
};

// VehicleFactory 클래스 정의
class VehicleFactory {
public:
    enum VehicleType {
        VT_Car,
        VT_Bike
    };

    // 팩토리 메서드
    static std::unique_ptr<Vehicle> createVehicle(VehicleType type) {
        switch (type) {
            case VT_Car:
                return std::make_unique<Car>();
            case VT_Bike:
                return std::make_unique<Bike>();
            default:
                return nullptr;
        }
    }
};

// 메인 함수
int main() {
    auto car = VehicleFactory::createVehicle(VehicleFactory::VT_Car);
    car->info();

    auto bike = VehicleFactory::createVehicle(VehicleFactory::VT_Bike);
    bike->info();

    return 0;
}

이 예제에서 VehicleFactory는 Vehicle 객체를 생성하는 중앙 집중화된 위치를 제공합니다. 이를 통해, 클라이언트 코드는 구체적인 클래스 타입에 대해 알 필요 없이, 필요한 타입의 객체를 쉽게 생성할 수 있습니다. VehicleFactory의 createVehicle 메서드는 클라이언트가 요청하는 VehicleType에 따라 Car 또는 Bike 인스턴스를 생성하고 반환합니다.

팩토리 메서드 패턴을 사용함으로써, 시스템은 더 유연하고 확장성 있는 구조를 가질 수 있으며, 새로운 Vehicle 타입이 추가되더라도 기존 코드를 변경하지 않고 확장할 수 있는 장점이 있습니다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함