μ±κΈν€ ν¨ν΄(Singleton Pattern)
μ μ λ³μλ₯Ό μ¬μ©νμ§ μκ³ μΈμ€ν΄μ€λ₯Ό νλλ§ μμ±νλλ‘ νλ©° μμ±λ μΈμ€ν΄μ€λ₯Ό μ΄λμλ μ¬μ©ν μ μλ ν¨ν΄μ΄λ€. μΈμ€ν΄μ€λ₯Ό μ¬λ¬ κ° λ§λ€λ©΄ μμμ λλΉνκ±°λ λ²κ·Έλ₯Ό λ°μμν¬ μ μμΌλ―λ‘ μ€μ§ νλλ§ μμ±νλ€.
ꡬν
νλμ μΈμ€ν΄μ€λ§ μ μ§νκΈ° μν΄ μμ±μμ private μ κ·Ό μ μ΄μλ₯Ό μ§μ νκ³ μ μΌν λ¨μΌ κ°μ²΄λ₯Ό λ°νν μ μλλ‘ μ μ λ©μλλ₯Ό μ§μν΄μΌ νλ€.
#include <iostream>
using namespace std;
// λ€μ΄λλ―Ή μ±κΈν€(Dynamic Singleton)
// κ²μΌλ₯Έ μ΄κΈ°ν: μ±κΈν€μ μ€μ λ‘ νμλ‘ ν λκΉμ§ μ΄κΈ°νλ₯Ό 미룬λ€.
class DynamicSingleton {
private:
DynamicSingleton() {}
static DynamicSingleton* Instance;
public:
static DynamicSingleton* getInstance()
{
if (Instance == NULL)
Instance = new DynamicSingleton();
return Instance;
}
};
DynamicSingleton* DynamicSingleton::Instance = nullptr;
// μ€νν± μ§μ μ±κΈν€(Static Local Singleton)
// C++ 11μμλ μ μ λ³μ μ΄κΈ°νκ° λ©ν°μ€λ λ νκ²½μμλ λ± νλ² μ€νλμ΄μΌ νλ€.
// Singleton ν΄λμ€μλ λ¬λ¦¬ μ€λ λ μμ (Thread Safe)νλ€.
class StaticSingleton
{
private:
StaticSingleton() {}
public:
static StaticSingleton* getInstance()
{
static StaticSingleton Instance;
return &Instance;
}
};
int main()
{
DynamicSingleton* s1 = DynamicSingleton::getInstance(); // μ΄ μμ μ μμ±
StaticSingleton* s2 = StaticSingleton::getInstance();
}