프로그래밍/GoF

[생성 패턴] - 추상 팩토리(Abstract Factory)

MAKGA 2022. 1. 12. 09:36
320x100

구조

#pragma once

#include <iostream>

class IProduct
{
public:
    virtual void Operation() = 0;
};

class IAbstractFactory
{
public:
    virtual IProduct* CreateProduct() = 0;
};

class ProductA : public IProduct
{
public:
    void Operation() override
    {
        std::cout << "Operating ProductA" << std::endl;
    }
};

class ProductB : public IProduct
{
public:
    void Operation() override
    {
        std::cout << "Operating ProductB" << std::endl;
    }
};

class AbstractFactoryA : public IAbstractFactory
{
public:
    IProduct* CreateProduct() override
    {
        return new ProductA();
    }
};

class AbstractFactoryB : public IAbstractFactory
{
public:
    IProduct* CreateProduct() override
    {
        return new ProductB();
    }
};

 

사용

int main()
{
    IAbstractFactory* abstractFactory = nullptr;
    IProduct* product = nullptr;

    abstractFactory = new AbstractFactoryA();
    product = abstractFactory->CreateProduct();

    product->Operation();

    abstractFactory = new AbstractFactoryB();
    product = abstractFactory->CreateProduct();

    product->Operation();

    system("pause");
    return 0;
}

구조의 생성을 수행하는 팩토리 클래스(AbstractFactory)를 정의하여 클라이언트가 팩토리 클래스의 인터페이스(CreateProduct())를 통해 구조를 생성할 수 있게 한다. 추상 팩토리 구조의 생성에 관한 구체적인 내용이 팩토리 클래스에서 구현되기에 구조의 생성에 대한 유연한 확장을 지원하고 클라이언트는 어떤 팩토리 객체를 사용하냐에 따라 다른 구조를 클라이언트가 세부 클래스를 이해할 필요 없이 제공받을 수 있다.

 

 

320x100