- 1. Conclusion
Discussion. "Think of object creation as a factory that spawns those same objects."
Here we assign object creation responsibilities to the factory object, and then use inheritance functions and virtual members to provide a "virtual constructor" capability. So there are two aspects. The client uses a factory object instead of the "new" operator to request instantiation; and the client is "hard-wired" to the family or class of that factory, and relies on the abstract base class for the duration of the application.
#include <iostream.h> class Shape { public: Shape() { id_ = total_++; } virtual void draw() = 0; protected: int id_; static int total_; }; int Shape::total_ = 0; class Circle : public Shape { public: void draw() { cout << "circle " << id_ << ": draw" << endl; } }; class Square : public Shape { public: void draw() { cout << "square " << id_ << ": draw" << endl; } }; class Ellipse : public Shape { public: void draw() { cout << "ellipse " << id_ << ": draw" << endl; } }; class Rectangle : public Shape { public: void draw() { cout << "rectangle " << id_ << ": draw" << endl; } }; class Factory { public: virtual Shape* createCurvedInstance() = 0; virtual Shape* createStraightInstance() = 0; }; class SimpleShapeFactory : public Factory { public: Shape* createCurvedInstance() { return new Circle; } Shape* createStraightInstance() { return new Square; } }; class RobustShapeFactory : public Factory { public: Shape* createCurvedInstance() { return new Ellipse; } Shape* createStraightInstance() { return new Rectangle; } }; int main() { #ifdef SIMPLE Factory* factory = new SimpleShapeFactory; #elif ROBUST Factory* factory = new RobustShapeFactory; #endif Shape* shapes[3]; shapes[0] = factory->createCurvedInstance(); // shapes[0] = new Ellipse; shapes[1] = factory->createStraightInstance(); // shapes[1] = new Rectangle; shapes[2] = factory->createCurvedInstance(); // shapes[2] = new Ellipse; for (int i=0; i < 3; i++) { shapes[i]->draw(); } }
Conclusion
ellipse 0: draw rectangle 1: draw ellipse 2: draw