#include<iostream>
#include<string>
using namespace std;
class AbstractProductA{
public:
virtual ~AbstractProductA(){ }
virtual string methodA()const = 0;
};
class ProductA1 : public AbstractProductA{
public:
string methodA()const override
{
return "ProductA1";
}
};
class ProductA2 : public AbstractProductA{
public:
string methodA()const override
{
return "ProductA2";
}
};
class AbstractProductB{
public:
virtual ~AbstractProductB(){ }
virtual string methodB()const = 0;
};
class ProductB1 : public AbstractProductB{
public:
string methodB()const override
{
return "ProductB1";
}
};
class ProductB2 : public AbstractProductB{
public:
string methodB()const override
{
return "ProductB2";
}
};
class AbstractFactory{
public:
virtual ~AbstractFactory() { }
virtual AbstractProductA* createProductA()const = 0;
virtual AbstractProductB* createProductB()const = 0;
};
class FactoryA : public AbstractFactory{
public:
AbstractProductA* createProductA()const override
{
return new ProductA1;
}
AbstractProductB* createProductB()const override
{
return new ProductB1;
}
};
class FactoryB : public AbstractFactory{
public:
AbstractProductA* createProductA()const override
{
return new ProductA2;
}
AbstractProductB* createProductB()const override
{
return new ProductB2;
}
};
void client(const AbstractFactory& factory)
{
AbstractProductA* pa = factory.createProductA();
AbstractProductB* pb = factory.createProductB();
cout << pa->methodA() << endl;
cout << pb->methodB() << endl;
delete pa, pb;
}
int main()
{
FactoryA *fa = new FactoryA;
client(*fa);
FactoryB * fb = new FactoryB;
client(*fb);
delete fa, fb;
return 0;
}