기본적으로 목적에 차이를 둔다. Factory Method는 객체 생성의 일부를 서브클래스로 미루어, 구현의 변화에 대응하는 것이 주된 목적이며, 객체 생성에 필요한 인터페이스를 정의하고, 구체적인 생성 로직은 서브클래스에서 구현하는 것이다.
Abstract Factory는 이와 다르게, 여러 종류의 관련된 객체들의 집합을 생성하는 것이 주된 목적이다.
즉, Factory Method는 객체 생성의 일부를 서브클래스로 미루거나, 개별 객체를 생성하고자 할때 활용하며, 객체 "군" 자체를 추가하거나, 객체들이 함께 사용되어야 하는 상황에서는 Abstract Factory가 유용하다고 정리할 수 있다.
다음 예제 코드를 첨부한다.
#include <bits/stdc++.h>
using namespace std;
// Abstract Product A
class AbstractProductA {
public:
virtual string operationA() const = 0;
virtual ~AbstractProductA() = default;
};
// Concrete Product A1
class ConcreteProductA1 : public AbstractProductA {
public:
string operationA() const override {
return "ConcreteProductA1 Operation";
}
};
// Concrete Product A2
class ConcreteProductA2: public AbstractProductA {
public:
string operationA() const override {
return "ConcreteProductA2 Operation";
}
};
// Abstract Product B
... 생략 (위와 같이 AbstractProductB 를 생성하고 구현체 두개를 생성)
// AbstractFactory (추상팩토리)
class AbstractFactory {
public:
virtual AbstractProductA* createProductA() const = 0;
virtual AbstractProductB* createProductB() const = 0;
virtual ~AbstractFactory() = default;
};
// ConcreteFactory1 (추상팩토리 구현체)
class ConcreteFactory1 : public AbstractFactory {
public:
AbstractProductA* createProductA() const override {
return new ConcreteProductA1();
}
AbstractProductB* createProductB() const override {
return new ConcreteProductB1();
}
};
// ConcreteFactory2
class ConcreteFactory2 : public AbstractFactory {
AbstractProductA* createProductA() const override {
return new ConcreteProductA2();
}
AbstractProductB* createProductB() const override {
return new ConcreteProductB2();
}
}
// Client
void clientCode(const AbstractFactory& factory) {
AbstractProductA* productA = factory.createProductA();
AbstractProductB* productB = factory.createProductB();
cout << productA->operationA() << endl;
cout << productB->operationB() << endl;
delete productA;
delete productB;
}
int main()
{
ConcreteFactory1 factory1;
ConcreteFactory2 factory2;
clientCode(factory1);
clientCode(factory2);
return 0;
}
#출력
ConcreteProductA1 Operation
ConcreteProductB1 Operation
ConcreteProductA2 Operation
ConcreteProductB2 Operation