[C/C++] 프로토타입 패턴(Prototype Pattern)

할랑말랑·2026년 3월 30일

C/C++

목록 보기
43/45

프로토타입 패턴(Prototype Pattern)

초기 객체 생성 비용이 많이 드는 경우 사용하는 패턴
객체를 생성할 때 기존 객체의 복사를 통해 생성한다.

1. 특징

  • 복사 기반 생성 : 객체의 복사해서 새 객체 생성
  • 동적 생성: 런타임 중에 어떤 객체를 복제할지 결정할 수 있어 유연합니다.

2. 장점

  • 생성 비용 절감
  • 복잡한 객체를 쉽게 복제
  • 객체 종류의 은닉

3. 단점

  • 깊은 복사의 복잡성
  • 순환 참조 : 객체들이 서로를 참조하고 있는 복잡한 구조라면 복제 과정에서 무한 루프에 빠지거나 연결 관계가 꼬일 위험이 있다

Prototype Pattern 예시

#include <iostream>
#include <windows.h> // Sleep 함수를 위해 사용됩니다.
#include <vector>

class Slime
{
private:
    int hp;
    int attack;

public:
    // 생성자: hp와 attack 값을 받아 초기화합니다.
    Slime(int _hp, int _attack) : hp(_hp), attack(_attack)
    {
        std::cout << "[생성] - 생성 중..." << std::endl;
        Sleep(1000); // 1초 대기
        std::cout << "[완료] - 생성 완료(1초)!" << std::endl;
    }

    // 복사 생성자: 다른 Slime 객체를 복사하여 생성합니다.
    Slime(const Slime& _other)
    {
        std::cout << "[복제] - 복제 중..." << std::endl;
        hp = _other.hp;
        attack = _other.attack;
        std::cout << "[완료] - 복제 완료(즉시)!" << std::endl;
    }

    void ShowInfo()
    {
        std::cout << "HP : " << hp << ", 공격력 : " << attack << std::endl;
    }

    // 객체 자신을 복제하여 unique_ptr로 반환하는 Clone 함수 (프로토타입 패턴)
    std::unique_ptr<Slime> Clone()
    {
        return std::make_unique<Slime>(*this);
    }
};

int main()
{
    std::cout << "========== 프로토타입 생성 ==========" << std::endl;
    // HP 10, 공격력 20을 가진 슬라임 원본(프로토타입)을 생성합니다.
    std::unique_ptr<Slime> prototype = std::make_unique<Slime>(10, 20);

    std::cout << "\n========== 슬라임 10마리 복제 ==========" << std::endl;
    // 복제된 슬라임들을 담을 벡터를 생성합니다.
    std::vector<std::unique_ptr<Slime>> slimes;

    // 프로토타입을 10번 복제하여 벡터에 추가합니다.
    for (int i = 0; i < 10; i++)
    {
        std::cout << i + 1 << "번째 슬라임: ";
        slimes.push_back(prototype->Clone());
    }

    return 0;
}

0개의 댓글