ShadyLiar

Fabrica

Jun 1st, 2024
671
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.10 KB | None | 0 0
  1. /******************************************************************************
  2.  
  3.                               Online C++ Compiler.
  4.                Code, Compile, Run and Debug C++ program online.
  5. Write your code in this editor and press "Run" button to compile and execute it.
  6.  
  7. *******************************************************************************/
  8.  
  9. #include <iostream>
  10. #include <unordered_map>
  11. #include <cassert>
  12.  
  13. class IProduct
  14. {
  15.     public:
  16.         virtual void Release() = 0;
  17. };
  18.  
  19. class IWorkShop
  20. {
  21.     public:
  22.         virtual IProduct* Generate() = 0;
  23. };
  24.  
  25. class Vehicle{};
  26.  
  27. class Car final : public Vehicle, public IProduct{ public: virtual void Release() override { std::cout << "Создана Машина \n"; } };
  28. class Tank final : public Vehicle, public IProduct{ public: virtual void Release() override {std::cout << "Создан Танк \n";} };
  29. class Scooter final : public Vehicle, public IProduct{ public: virtual void Release() override {std::cout << "Создан Скутер \n";} };
  30. class Bike final : public Vehicle, public IProduct{ public: virtual void Release() override {std::cout << "Создана Байк \n";} };
  31. class Boat final : public Vehicle, public IProduct{ public: virtual void Release() override {std::cout << "Создана Лодка \n";} };
  32.  
  33. class CarWorkShop : public IWorkShop
  34. {
  35.      virtual IProduct* Generate() override { return new Car(); }
  36. };
  37. class TankWorkShop : public IWorkShop
  38. {
  39.     virtual IProduct* Generate() override { return new Tank(); }
  40. };
  41. class ScooterWorkShop : public IWorkShop
  42. {
  43.     virtual IProduct* Generate() override { return new Scooter(); }
  44. };
  45. class BikeWorkShop : public IWorkShop
  46. {
  47.     virtual IProduct* Generate() override { return new Bike(); }
  48. };
  49. class BoatWorkShop : public IWorkShop
  50. {
  51.     virtual IProduct* Generate() override { return new Boat(); }
  52. };
  53.  
  54. class BaseWorkShop // Можно было сделать статичным классом со статичными методами, но тем не менее я сделал так.
  55. {
  56.     private:
  57.         std::unordered_map<int, IWorkShop*> WorkShops;
  58.      
  59.     public:
  60.    
  61.     BaseWorkShop()
  62.     {
  63.         WorkShops[0] = new CarWorkShop();
  64.         WorkShops[1] = new TankWorkShop();
  65.         WorkShops[2] = new ScooterWorkShop();
  66.         WorkShops[3] = new BikeWorkShop();
  67.         WorkShops[4] = new BoatWorkShop();
  68.     }
  69.    
  70.     ~BaseWorkShop()
  71.     {
  72.         for (auto& pair : WorkShops) {
  73.             delete pair.second;
  74.             pair.second = nullptr;
  75.         }
  76.         WorkShops.clear();
  77.     }
  78.    
  79.     IProduct* GenerateProductById(int id)
  80.     {
  81.  
  82.         assert(id >= 0 && id <= WorkShops.size() && WorkShops.at(id) != nullptr); // Если не выполняются эти условия, программа дальше не идет.
  83.         return WorkShops[id]->Generate();
  84.     }
  85.    
  86.    
  87.    
  88. };
  89.  
  90.  
  91.  
  92.  
  93. int main()
  94. {
  95.     BaseWorkShop* BigShop = new BaseWorkShop();
  96.    
  97.     Car* car = dynamic_cast<Car*>( BigShop->GenerateProductById(0) );
  98.     car->Release();
  99.    
  100.     delete BigShop;
  101.  
  102.     return 0;
  103. }
  104.  
Advertisement
Add Comment
Please, Sign In to add comment