[ Unreal Engine 5 / #20 Singleton, Factory ]

SeungWoo·2024년 10월 14일
0

[ Ureal Engine 5 / 수업 ]

목록 보기
21/31
post-thumbnail

싱글톤 패턴 (Singleton Pattern) 개요

싱글톤 패턴(Singleton Pattern)은 한 클래스에 오직 하나의 인스턴스만 존재하도록 보장하고, 어디서든지 이 인스턴스에 전역적으로 접근할 수 있게 하는 디자인 패턴입니다. 주로 애플리케이션 전반에서 공유되는 전역 상태 관리나 리소스 관리에 사용됩니다.

  • 특징
    • 유일한 인스턴스 보장 : 특정 클래스에 대한 인스턴스가 하나만 존재하도록 보장합니다.
    • 글로벌 접근 제공 : 애플리케이션 어디서든지 그 클래스의 인스턴스에 접근할 수 있게 합니다.
    • 인스턴스 관리 : 클래스가 인스턴스를 스스로 관리하며, 필요할 때만 생성하고 계속 재사용합니다.
  • 언리얼 엔진에서 싱글톤 패턴을 활용할 때 주의 사항
    • 게임 인스턴스와의 차이 : Unreal Engine에서는 UGameInstance 클래스가 싱글톤처럼 동작합니다.
    • 게임 전체에서 전역적으로 데이터를 관리해야 할 때는 UGameInstance를 사용하는 것이 더 효율적일 수 있습니다. 하지만, 특정 기능이나 상태를 별도로 관리하고자 할 때는 여전히 싱글톤 패턴을 유용하게 사용할 수 있습니다.
    • Garbage Collection : 언리얼 엔진은 가비지 컬렉션(GC) 시스템을 가지고 있습니다. 싱글톤 객체가 엔진의 GC 영역에 들어가지 않도록 해야 합니다.
    • Unreal Engine의 UObject 기반 클래스가 아니라면 메모리 관리에 신경을 써야 합니다.

싱글톤 패턴 (Singleton Pattern)

 class Singleton
{
private:
    static Singleton* Instance;

    // 생성자를 private으로 선언하여 외부에서 인스턴스를 생성할 수 없도록 합니다.
    Singleton() {}

public:
    // 인스턴스를 반환하는 정적 메서드
    static Singleton* GetInstance()
    {
        if (Instance == nullptr)
        {
            Instance = new Singleton();
        }
        return Instance;
    }

    // 예시 메서드
    void DoSomething() {}
};

// 정적 변수 초기화
Singleton* Singleton::Instance = nullptr;

팩토리 패턴 (Factory Pattern)

팩토리 패턴은 객체 생성을 캡슐화하는 디자인 패턴입니다. 클래스의 인스턴스를 직접 생성하지 않고, 팩토리 메서드를 통해 필요한 객체를 생성하여 반환합니다. 객체의 생성 로직을 중앙에서 관리할 수 있어 유연성이 높습니다.

  • 특징
    • 객체 생성 로직을 하나의 클래스 또는 메서드에서 관리합니다.
    • 생성할 객체의 타입을 동적으로 결정할 수 있습니다.
    • 주로 여러 유형의 객체를 생성할 때 사용됩니다.
  • 장점
    • 객체 생성 로직을 중앙에서 관리하므로 코드의 유지보수가 용이합니다.
    • 새로운 객체 타입을 추가하기 쉽습니다.
  • 단점
    • 객체 생성 로직이 복잡해질 수 있으며, 객체를 직접 생성하지 않기 때문에 디버깅이 어려울 수 있습니다.

팩토리 패턴 (Factory Pattern)

class Product
{
public:
    virtual void Use() = 0;
};

class ConcreteProductA : public Product
{
public:
    void Use() override { /* A 타입 제품 사용 */ }
};

class ConcreteProductB : public Product
{
public:
    void Use() override { /* B 타입 제품 사용 */ }
};

class ProductFactory
{
public:
    static Product* CreateProduct(const std::string& Type)
    {
        if (Type == "A")
            return new ConcreteProductA();
        else if (Type == "B")
            return new ConcreteProductB();
        
        return nullptr;
    }
};
profile
This is my study archive

0개의 댓글