티스토리 뷰
반응형
샘플 소스코드 다운로드
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;
}
구현에 대한 설명
- 추상화: Vehicle은 추상 기본 클래스로, 모든 구체적인 제품(Car, Bicycle)이 구현해야 하는 인터페이스를 정의합니다.
- 팩토리 메서드: VehicleFactory 클래스의 createVehicle() 메서드가 팩토리 메서드입니다. 이 메서드는 순수 가상 함수로 선언되어 하위 클래스에서 반드시 구현해야 합니다.
- 구체적인 팩토리: CarFactory와 BicycleFactory는 VehicleFactory를 상속받아 구체적인 Vehicle 객체를 생성합니다.
- 공통 로직: VehicleFactory의 deliverVehicle() 메서드는 공통 로직을 포함하며, 팩토리 메서드를 사용하여 객체를 생성합니다.
- 스마트 포인터 사용: std::unique_ptr을 사용하여 메모리 관리를 자동화하고 리소스 누수를 방지합니다.
- 개방-폐쇄 원칙: 새로운 종류의 Vehicle을 추가할 때 기존 코드를 수정하지 않고 새로운 클래스를 추가할 수 있습니다.
- 의존성 역전: 클라이언트 코드는 구체적인 클래스가 아닌 추상 인터페이스에 의존합니다.
이 구현 방식의 장점
- 객체 생성 로직을 캡슐화하여 클라이언트 코드와 분리합니다.
- 새로운 제품 유형을 쉽게 추가할 수 있어 확장성이 좋습니다.
- 코드 재사용성이 높아집니다.
주의할 점
- 제품 종류가 많아지면 클래스 수가 증가할 수 있습니다.
- 간단한 경우에는 과도한 복잡성을 초래할 수 있습니다.
개인적으로 학습하면서 정리한 내용입니다.
잘못된 내용이 있을 경우 알려주시면 확인 후 수정 및 반영하도록 하겠습니다.
'개발 > C++' 카테고리의 다른 글
디자인 패턴에 대해 알아보자 - 프로토타입 패턴 (1) | 2024.10.07 |
---|---|
디자인 패턴에 대해 알아보자 - 추상 팩토리 패턴 (1) | 2024.09.27 |
디자인 패턴에 대해 알아보자 - 싱글톤 패턴 (1) | 2024.09.25 |
C++ : 실무에서 사용되는 디자인 패턴 정리 (0) | 2024.09.24 |
싱글턴 패턴 동기화 처리 (0) | 2023.05.06 |