초기 객체 생성 비용이 많이 드는 경우 사용하는 패턴
객체를 생성할 때 기존 객체의 복사를 통해 생성한다.
#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; }