#include <iostream>
using namespace std;
class BaseClass {
public:
BaseClass() { cout << "Constructor BaseClass" << endl; }
virtual void Tell() { cout << "I'm BaseClass" << endl; }
};
class ClassA: public BaseClass {
public:
ClassA() { cout << "Constructor ClassA" << endl; }
void Tell() { cout << "I'm ClassA" << endl; }
};
class ClassB: public BaseClass {
public:
ClassB() { cout << "Constructor ClassB" << endl; }
void Tell() { cout << "I'm ClassB" << endl; }
};
class BaseFactory {
public:
BaseFactory() { cout << "BaseFactory constructor" << endl; }
virtual void Tell() const { cout << "I'm BaseFactory" << endl; }
virtual BaseClass * Produce() const { return new BaseClass(); }
};
class FactoryA: public BaseFactory {
public:
FactoryA() { cout << "FactoryA constructor" << endl; }
void Tell() const { cout << "I'm FactoryA" << endl; }
BaseClass * Produce() const {
cout << "FactoryA produce:" << endl;
return new ClassA();
}
};
class FactoryB: public BaseFactory {
public:
FactoryB() { cout << "FactoryB constructor" << endl; }
void Tell() const { cout << "I'm FactoryB" << endl; }
BaseClass * Produce() const {
cout << "FactoryA produce:" << endl;
return new ClassB();
}
};
static BaseFactory * factoryA = new FactoryA();
static BaseFactory * factoryB = new FactoryB();
void CreateSome( BaseClass* &object, const BaseFactory& SomeFactory ) {
SomeFactory.Tell();
object = SomeFactory.Produce();
}
int main()
{
BaseClass* T;
CreateSome(T, *factoryA);
T->Tell();
}