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
'프로그래밍 > GoF' 카테고리의 다른 글
[생성 패턴] - 빌더(Builder) (0) | 2022.01.12 |
---|---|
[구조 패턴] - 프록시 (Proxy) (0) | 2022.01.12 |
[구조 패턴] - 플라이웨이트(Flyweight) (0) | 2022.01.12 |
[구조 패턴] - 파사드(Facade) (0) | 2022.01.11 |
[구조 패턴] - 데코레이터(Decorator) (0) | 2022.01.11 |