Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /******************************************************************************
- Online C++ Compiler.
- Code, Compile, Run and Debug C++ program online.
- Write your code in this editor and press "Run" button to compile and execute it.
- *******************************************************************************/
- #include <iostream>
- #include <unordered_map>
- #include <cassert>
- class IProduct
- {
- public:
- virtual void Release() = 0;
- };
- class IWorkShop
- {
- public:
- virtual IProduct* Generate() = 0;
- };
- class Vehicle{};
- class Car final : public Vehicle, public IProduct{ public: virtual void Release() override { std::cout << "Создана Машина \n"; } };
- class Tank final : public Vehicle, public IProduct{ public: virtual void Release() override {std::cout << "Создан Танк \n";} };
- class Scooter final : public Vehicle, public IProduct{ public: virtual void Release() override {std::cout << "Создан Скутер \n";} };
- class Bike final : public Vehicle, public IProduct{ public: virtual void Release() override {std::cout << "Создана Байк \n";} };
- class Boat final : public Vehicle, public IProduct{ public: virtual void Release() override {std::cout << "Создана Лодка \n";} };
- class CarWorkShop : public IWorkShop
- {
- virtual IProduct* Generate() override { return new Car(); }
- };
- class TankWorkShop : public IWorkShop
- {
- virtual IProduct* Generate() override { return new Tank(); }
- };
- class ScooterWorkShop : public IWorkShop
- {
- virtual IProduct* Generate() override { return new Scooter(); }
- };
- class BikeWorkShop : public IWorkShop
- {
- virtual IProduct* Generate() override { return new Bike(); }
- };
- class BoatWorkShop : public IWorkShop
- {
- virtual IProduct* Generate() override { return new Boat(); }
- };
- class BaseWorkShop // Можно было сделать статичным классом со статичными методами, но тем не менее я сделал так.
- {
- private:
- std::unordered_map<int, IWorkShop*> WorkShops;
- public:
- BaseWorkShop()
- {
- WorkShops[0] = new CarWorkShop();
- WorkShops[1] = new TankWorkShop();
- WorkShops[2] = new ScooterWorkShop();
- WorkShops[3] = new BikeWorkShop();
- WorkShops[4] = new BoatWorkShop();
- }
- ~BaseWorkShop()
- {
- for (auto& pair : WorkShops) {
- delete pair.second;
- pair.second = nullptr;
- }
- WorkShops.clear();
- }
- IProduct* GenerateProductById(int id)
- {
- assert(id >= 0 && id <= WorkShops.size() && WorkShops.at(id) != nullptr); // Если не выполняются эти условия, программа дальше не идет.
- return WorkShops[id]->Generate();
- }
- };
- int main()
- {
- BaseWorkShop* BigShop = new BaseWorkShop();
- Car* car = dynamic_cast<Car*>( BigShop->GenerateProductById(0) );
- car->Release();
- delete BigShop;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment