Зміст
- 1. Висновок
Обговорення. «Подумайте про створення об'єктів як про фабрику, яка породжує ці об'єкти».
Тут ми призначаємо обов'язки створення об'єктів фабричного об'єкту, а потім використовуємо функції успадкування та віртуальні члени для надання можливості «віртуального конструктора». Таким чином, існують два аспекти. Клієнт використовує фабричний об'єкт замість оператора new для запиту створення екземплярів; і клієнт має «жорстку прив'язку» до сімейства або класу цієї фабрики, і протягом усієї роботи додаток покладається на абстрактний базовий клас.
- #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();
- }
- }
Висновок
- ellipse 0: draw
- rectangle 1: draw
- ellipse 2: draw