Evgenii Legotckoi
13 вересня 2018 р. 16:12

Приклад - Абстрактна фабрика C++

Зміст

Обговорення. «Подумайте про створення об'єктів як про фабрику, яка породжує ці об'єкти».

Тут ми призначаємо обов'язки створення об'єктів фабричного об'єкту, а потім використовуємо функції успадкування та віртуальні члени для надання можливості «віртуального конструктора». Таким чином, існують два аспекти. Клієнт використовує фабричний об'єкт замість оператора new для запиту створення екземплярів; і клієнт має «жорстку прив'язку» до сімейства або класу цієї фабрики, і протягом усієї роботи додаток покладається на абстрактний базовий клас.


  1. #include <iostream.h>
  2.  
  3. class Shape {
  4. public:
  5. Shape() {
  6. id_ = total_++;
  7. }
  8. virtual void draw() = 0;
  9. protected:
  10. int id_;
  11. static int total_;
  12. };
  13. int Shape::total_ = 0;
  14.  
  15. class Circle : public Shape {
  16. public:
  17. void draw() {
  18. cout << "circle " << id_ << ": draw" << endl;
  19. }
  20. };
  21. class Square : public Shape {
  22. public:
  23. void draw() {
  24. cout << "square " << id_ << ": draw" << endl;
  25. }
  26. };
  27. class Ellipse : public Shape {
  28. public:
  29. void draw() {
  30. cout << "ellipse " << id_ << ": draw" << endl;
  31. }
  32. };
  33. class Rectangle : public Shape {
  34. public:
  35. void draw() {
  36. cout << "rectangle " << id_ << ": draw" << endl;
  37. }
  38. };
  39.  
  40. class Factory {
  41. public:
  42. virtual Shape* createCurvedInstance() = 0;
  43. virtual Shape* createStraightInstance() = 0;
  44. };
  45.  
  46. class SimpleShapeFactory : public Factory {
  47. public:
  48. Shape* createCurvedInstance() {
  49. return new Circle;
  50. }
  51. Shape* createStraightInstance() {
  52. return new Square;
  53. }
  54. };
  55. class RobustShapeFactory : public Factory {
  56. public:
  57. Shape* createCurvedInstance() {
  58. return new Ellipse;
  59. }
  60. Shape* createStraightInstance() {
  61. return new Rectangle;
  62. }
  63. };
  64.  
  65. int main() {
  66. #ifdef SIMPLE
  67. Factory* factory = new SimpleShapeFactory;
  68. #elif ROBUST
  69. Factory* factory = new RobustShapeFactory;
  70. #endif
  71. Shape* shapes[3];
  72.  
  73. shapes[0] = factory->createCurvedInstance(); // shapes[0] = new Ellipse;
  74. shapes[1] = factory->createStraightInstance(); // shapes[1] = new Rectangle;
  75. shapes[2] = factory->createCurvedInstance(); // shapes[2] = new Ellipse;
  76.  
  77. for (int i=0; i < 3; i++) {
  78. shapes[i]->draw();
  79. }
  80. }

Висновок

  1. ellipse 0: draw
  2. rectangle 1: draw
  3. ellipse 2: draw

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
  • Останні коментарі
  • Evgenii Legotckoi
    16 квітня 2025 р. 17:08
    Благодарю за отзыв. И вам желаю всяческих успехов!
  • IscanderChe
    12 квітня 2025 р. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    01 квітня 2025 р. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    09 березня 2025 р. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    09 березня 2025 р. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…