before.cxx
#include <iostream>
#include <string>
class Apple {
public:
void sayHello(void) {
std::cout << "Hello, I'm a apple." << std::endl;
}
};
class Banana {
public:
void sayHello(void) {
std::cout << "Hello, I'm a banana." << std::endl;
}
};
class Pear {
public:
void sayHello(void) {
std::cout << "Hello, I'm a pear." << std::endl;
}
};
int main(void) {
Apple apple;
apple.sayHello();
// Banana banana;
// banana.sayHello();
// Pear pear;
// pear.sayHello();
return 0;
}
after.cxx
#include <iostream>
#include <string>
#include "config.hxx"
class Fruit {
public:
virtual void sayHello(void) = 0;
};
class Apple: public Fruit {
void sayHello(void) {
std::cout << "Hello, I'm a apple." << std::endl;
}
};
class Banana: public Fruit {
public:
void sayHello(void) {
std::cout << "Hello, I'm a banana." << std::endl;
}
};
class Pear: public Fruit {
public:
void sayHello(void) {
std::cout << "Hello, I'm a pear." << std::endl;
}
};
class FruitFactory {
public:
virtual Fruit *createFruit(void) = 0;
};
class AppleFactory: public FruitFactory {
public:
Fruit *createFruit(void) {
return new Apple();
}
};
class BananaFactory: public FruitFactory {
public:
Fruit *createFruit(void) {
return new Banana();
}
};
class PearFactory: public FruitFactory {
public:
Fruit *createFruit(void) {
return new Pear();
}
};
int main(void) {
FruitFactory *fruitFactory = &_FRUIT_FACTORY_();
Fruit *fruit = fruitFactory->createFruit();
fruit->sayHello();
delete fruit;
return 0;
}
config.hxx
#define _FRUIT_FACTORY_ AppleFactory
// #define _FRUIT_FACTORY_ BananaFactory
// #define _FRUIT_FACTORY_ PearFactory