The following is an example of abstract factory Design Pattern tested on RHEL 5 with gcc 4.1.2.
The program will also work on visual studio with little or no modifications.
/*
* File : abstract_factory.cpp
* Note : uncomment the SIMPLE or ROBUST to use
*/
#include <iostream>
//#define SIMPLE 1
#define ROBUST 2
using namespace std;
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();
}
}
/*
[sgupta@rhel55x86 abstract_factory]$ ./abstract_factory
[sgupta@rhel55x86 abstract_factory]$ ./abstract_factory
ellipse 0: draw
rectangle 1: draw
ellipse 2: draw
[sgupta@rhel55x86 abstract_factory]$
[sgupta@rhel55x86 abstract_factory]$
*/
No comments:
Post a Comment