vladkomarr

abstractFactory

Oct 28th, 2014
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.25 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4.  
  5. class Infantryman {
  6. public:
  7.     virtual void info() = 0;
  8.     virtual ~Infantryman() { }
  9. };
  10.  
  11. class Archer {
  12. public:
  13.     virtual void info() = 0;
  14.     virtual ~Archer() { }
  15. };
  16.  
  17. class Horseman {
  18. public:
  19.     virtual void info() = 0;
  20.     virtual ~Horseman() { }
  21. };
  22.  
  23. class RomanInfantryman : public Infantryman {
  24. public:
  25.     void info() {
  26.         std::cout << "RomanInfantryman" << std::endl;
  27.     }
  28. };
  29.  
  30. class RomanArcher : public Archer {
  31. public:
  32.     void info() {
  33.         std::cout << "RomanArcher" << std::endl;
  34.     }
  35. };
  36.  
  37. class RomanHorseman : public Horseman {
  38. public:
  39.     void info() {
  40.         std::cout << "RomanHorseman" << std::endl;
  41.     }
  42. };
  43.  
  44. class CarthaginianInfantryman: public Infantryman
  45. {
  46.   public:
  47.     void info() {
  48.       std::cout << "CarthaginianInfantryman" << std::endl;
  49.     }
  50. };
  51.  
  52. class CarthaginianArcher: public Archer
  53. {
  54.   public:
  55.     void info() {
  56.       std::cout << "CarthaginianArcher" << std::endl;
  57.     }
  58. };
  59.  
  60. class CarthaginianHorseman: public Horseman
  61. {
  62.   public:
  63.     void info() {
  64.       std::cout << "CarthaginianHorseman" << std::endl;
  65.     }
  66. };
  67.  
  68.  
  69. class ArmyFactory {
  70. public:
  71.     virtual Infantryman* createInfantryman() = 0;
  72.     virtual Archer* createArcher() = 0;
  73.     virtual Horseman* createHorseman() = 0;
  74.     virtual ~ArmyFactory() { }
  75. };
  76.  
  77. class RomanArmyFactory : public ArmyFactory {
  78. public:
  79.     Infantryman* createInfantryman() {
  80.         return new RomanInfantryman;
  81.     }
  82.     Archer* createArcher() {
  83.         return new RomanArcher;
  84.     }
  85.     Horseman* createHorseman() {
  86.         return new RomanHorseman;
  87.     }
  88. };
  89.  
  90. class CarthaganianArmyFactory : public ArmyFactory {
  91. public:
  92.     Infantryman* createInfantryman() {
  93.         return new CarthaginianInfantryman;
  94.     }
  95.     Archer* createArcher() {
  96.         return new CarthaginianArcher;
  97.     }
  98.     Horseman* createHorseman() {
  99.         return new CarthaginianHorseman;
  100.     }
  101. };
  102.  
  103. class Army {
  104. public:
  105.     std::vector<Infantryman*> vi;
  106.     std::vector<Archer*> va;
  107.     std::vector<Horseman*> vh;
  108.     ~Army() {
  109.         int i;
  110.         for(i = 0; i < vi.size(); ++i) delete vi[i];
  111.         for(i = 0; i < va.size(); ++i) delete va[i];
  112.         for(i = 0; i < vh.size(); ++i) delete vh[i];
  113.     }
  114.     void info() {
  115.         int i;
  116.         for(i = 0; i < vi.size(); ++i) vi[i]->info();
  117.         for(i = 0; i < va.size(); ++i) va[i]->info();
  118.         for(i = 0; i < vh.size(); ++i) vh[i]->info();
  119.     }
  120. };
  121.  
  122. class Game {
  123. public:
  124.     Army* createArmy(ArmyFactory& factory) {
  125.         Army *p = new Army;
  126.         p->vi.push_back(factory.createInfantryman());
  127.         p->va.push_back(factory.createArcher());
  128.         p->vh.push_back(factory.createHorseman());
  129.         return p;
  130.     }
  131. };
  132.  
  133.  
  134. int main() {
  135.     Game game;
  136.     RomanArmyFactory ra_factory;
  137.     CarthaganianArmyFactory ca_factory;
  138.  
  139.  
  140.     Army *ra = game.createArmy(ra_factory);
  141.     Army *ca = game.createArmy(ca_factory);
  142.  
  143.     ra->vi.push_back(ra_factory.createInfantryman());
  144.     std::cout << "Roman army:" << std::endl;
  145.     ra->info();
  146.     std::cout << "\nCarthaganian army:" << std::endl;
  147.     ca->info();
  148.  
  149.     return 0;
  150. }
Advertisement
Add Comment
Please, Sign In to add comment