Evgenij LegotskojSept. 13, 2018, 4:12 p.m.

Пример - Абстрактная фабрика на C++

Обсуждение. «Подумайте о создании объектов как о фабрике, которая порождает эти самые объекты».

Здесь мы назначаем обязанности создания объектов фабричному объекту, а затем используем функции наследования и виртуальные члены для предоставления возможности «виртуального конструктора». Таким образом, существуют два аспекта. Клиент использует фабричный объект вместо оператора «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
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
Support the author Donate

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting
SF

C++ - Test 001. The first program and data types

  • Result:73points,
  • Rating points1
E

C++ - Тест 003. Условия и циклы

  • Result:57points,
  • Rating points-2
E

C++ - Test 002. Constants

  • Result:25points,
  • Rating points-10
Last comments
D

Django - Tutorial 001. Deploying a site on Django + PostgreSQL + Gunicorn + Nginx

А почему нельзя? Где можно об этом почитать? Киньте, пожалуйста, в меня ссылкой.
D

Django - Tutoral 049. Optimizing Django Performance with a Real Project

Огромное спасибо вам за статью! Для меня стали открытием select_related и prefetch_related
t
  • t1m4
  • Feb. 24, 2021, 1:56 p.m.

Django - Tutorial 052. Redefining a User Model

В данном случае я заходил под superuser но все равно не появлялись эти поля

Django - Tutorial 001. Deploying a site on Django + PostgreSQL + Gunicorn + Nginx

Поднял сервис с помощью systemd, вот по этому мануалу: https://habr.com/ru/post/501414/
t
  • t1m4
  • Feb. 23, 2021, 6:11 p.m.

Django - Tutorial 052. Redefining a User Model

А как дать ему эти права?
Now discuss on the forum
M

как добавить списки в список, которые созданы динамически

Привет всем! Смотрите новое: https://cazino.website/luchshie-kazino/ лучшие онлайн казино россии - За регистрацию предоставляют до 225 фриспинов бесплатно + 100% бонуса до 500$ на первый д…

Не отдаётся статика на виртуальной машине

В итоге выставил 775 на все файлы проекта и всё заработало. Но я не уверен, что так правильно.
P
  • Pisych
  • March 3, 2021, 12:06 p.m.

Вывод данных из связанных таблиц.

Не знаю, правильно ли... Но работает <body>{% for i in CatList %} <ul> <li><h3>{{i.title}}</h3></li>{% for j in ProdList %}<ul>{…
M

нужна помощь с проектом qt c++

дали задание, на несколько дней. собираюсь делать, но хотел бы получить помощь более опытных людей, чтобы подкорректировать себя и подстраховаться. каким образом это можно сделать? …

QScrollArea dynamically add QCheckBoxes

Всё правильно. Это просто спамер, который отправился в вечный бан.
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB