before.cxx
#include <iostream>
#include <string>
class BlackCircle {
public:
void sayHello(void) {
std::cout << "Hello, I'm a black circle." << std::endl;
}
};
class BlackSquare {
public:
void sayGoodbye(void) {
std::cout << "Goodbye, You're a black square." << std::endl;
}
};
class WhiteCircle {
public:
void sayHello(void) {
std::cout << "Hello, I'm a white circle." << std::endl;
}
};
class WhiteSquare {
public:
void sayGoodbye(void) {
std::cout << "Goodbye, You're a white square." << std::endl;
}
};
int main(void) {
BlackCircle blackCircle;
blackCircle.sayHello();
BlackSquare blackSquare;
blackSquare.sayGoodbye();
// WhiteCircle whiteCircle;
// whiteCircle.sayHello();
// WhiteSquare whiteSquare;
// whiteSquare.sayGoodbye();
return 0;
}
after.cxx
#include <iostream>
#include <string>
#include "config.hxx"
class Circle {
public:
virtual void sayHello(void) = 0;
};
class Square {
public:
virtual void sayGoodbye(void) = 0;
};
class BlackCircle: public Circle {
public:
void sayHello(void) {
std::cout << "Hello, I'm a black circle." << std::endl;
}
};
class BlackSquare: public Square {
public:
void sayGoodbye(void) {
std::cout << "Goodbye, You're a black square." << std::endl;
}
};
class WhiteCircle: public Circle {
public:
void sayHello(void) {
std::cout << "Hello, I'm a white circle." << std::endl;
}
};
class WhiteSquare: public Square {
public:
void sayGoodbye(void) {
std::cout << "Goodbye, You're a white square." << std::endl;
}
};
class ShapeFactory {
public:
virtual Circle *createCircle(void) = 0;
virtual Square *createSquare(void) = 0;
};
class BlackShapeFactory: public ShapeFactory {
public:
Circle *createCircle(void) {
return new BlackCircle();
}
Square *createSquare(void) {
return new BlackSquare();
}
};
class WhiteShapeFactory: public ShapeFactory {
public:
Circle *createCircle(void) {
return new WhiteCircle();
}
Square *createSquare(void) {
return new WhiteSquare();
}
};
int main(void) {
ShapeFactory *shapeFactory = &_SHAPE_FACTORY_();
Circle *circle = shapeFactory->createCircle();
circle->sayHello();
delete circle;
Square *square = shapeFactory->createSquare();
square->sayGoodbye();
delete square;
return 0;
}
config.hxx
#define _SHAPE_FACTORY_ BlackShapeFactory
// #define _SHAPE_FACTORY_ WhiteShapeFactory