본문으로 바로가기

생성 패턴 - ① 팩토리 패턴

객체를 생성하는 일은 다소 번거롭고 많은 주의가 요구됩니다. 만약 생성 절차가 특별한 규칙을 따라야 한다면 객체를 생성하는 일은 더욱 까다로워집니다. 디자인 패턴에서 생성 패턴은 객체 생성의 어려움을 해소하기 위해 등장했습니다. 생성 패턴은 객체를 만드는 복잡한 과정을 추상화한 패턴입니다. 생성 패턴의 종류는 다음과 같습니다.

  • Factory Pattern
  • Factory Method Pattern
  • Abstract Factory Pattern
  • Builder Pattern
  • Singleton Pattern
  • Prototype Pattern

이번 글에서는 첫 번째 팩토리 패턴에 대해서 다뤄보도록 하겠습니다.

Factory Pattern (팩토리 패턴)

팩토리 패턴은 팩토리 객체 혹은 팩토리 함수를 사용하여서 객체를 생성하는 디자인 패턴입니다. 팩토리 패턴의 특징은 객체를 생성하는 인터페이스를 미리 정의하되, 인스턴스를 만들 클래스의 결정은 클라이언트에서 내리는 디자인 패턴입니다. 이런 팩토리 패턴을 사용하게 되면 복잡한 객체 생성과정을 클라이언트에서 다룰 필요가 없어집니다.

팩토리 함수 예시

먼저 팩토리 함수를 사용하는 예시를 살펴보겠습니다. 아래는 Animal을 상속받는 Cat과 Dog가 있을 때 Animal 포인터를 반환하는 팩토리 함수를 구현한 예시입니다.

class Animal {
public:
    enum class Type { Cat, Dog };
    virtual void Speak() = 0;
};
class Cat : public Animal {
public:
    void Speak() override { cout << "meow~" << endl; }
};
class Dog : public Animal {
public:
    void Speak() override { cout << "bark~!" << endl; }
};

unique_ptr<Animal> FactoryFunc(Animal::Type type)
{
    unique_ptr<Animal> animal;
    if (type == Animal::Type::Cat)
        animal = make_unique<Cat>();
    else if (type == Animal::Type::Dog)
        animal = make_unique<Dog>();
    return animal;
}
int main()
{
    auto kitty = FactoryFunc(Animal::Type::Cat);
    kitty->Speak();
    auto bingo = FactoryFunc(Animal::Type::Dog);
    bingo->Speak();

    return 0;
}

팩토리 객체 예시

팩토리 패턴은 함수뿐만 아니라 Factory 객체로도 구현할 수 있습니다. 팩토리 객체를 생성한 뒤 팩토리 객체의 메서드로 오브젝트를 생성하여 이와 같은 형태를 팩토리 메서드 패턴이라고도 부릅니다. 팩토리 메서드 패턴은 바로 다음 글에서 더 자세하게 다룹니다. 

// Animal, Cat, Dog 클래스는 위와 동일
class Factory {
public:
    unique_ptr<Animal> CreateAnimal(Animal::Type type)
    {
        unique_ptr<Animal> animal;
        if (type == Animal::Type::Cat)
            animal = make_unique<Cat>();
        else if (type == Animal::Type::Dog)
            animal = make_unique<Dog>();
        return animal;
    }
};
int main()
{
    Factory factoryObj;
    auto kitty = factoryObj.CreateAnimal(Animal::Type::Cat);
    kitty->Speak();
    auto bingo = factoryObj.CreateAnimal(Animal::Type::Dog);
    bingo->Speak();

    return 0;
}

팩토리 패턴의 장점

팩토리 패턴의 장점은 복잡한 오브젝트 생성과정을 클라이언트가 다룰 필요가 없다는 점입니다. 복잡한 과정은 팩토리 안에 숨겨두고 클라이언트는 오직 어떤 오브젝트를 생성할지 결정만 하면 됩니다.


<출처>

유튜브 채널 "코드없는 프로그래밍": https://www.youtube.com/channel/UCHcG02L6TSS-StkSbqVy6Fg

길벗 출판사: 모던 C++ 디자인 패턴(Dmitri Nesteruk 저)