vladkomarr

builder

Oct 28th, 2014
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.78 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. class Infantryman {
  7.   public:
  8.     void info() {
  9.       cout << "Infantryman" << endl;
  10.     }
  11. };
  12.  
  13. class Archer {
  14.   public:
  15.     void info() {
  16.       cout << "Archer" << endl;
  17.     }
  18. };
  19.  
  20. class Horseman {
  21.   public:
  22.     void info() {
  23.       cout << "Horseman" << endl;
  24.     }
  25. };
  26.  
  27. class Catapult {
  28.   public:
  29.     void info() {
  30.       cout << "Catapult" << endl;
  31.     }
  32. };
  33.  
  34. class Elephant {
  35.   public:
  36.     void info() {
  37.       cout << "Elephant" << endl;
  38.     }
  39. };
  40.  
  41. class Army {
  42. public:
  43.     vector<Infantryman> vi;
  44.     vector<Archer>      va;
  45.     vector<Horseman>    vh;
  46.     vector<Catapult>    vc;
  47.     vector<Elephant>    ve;
  48.  
  49.     void info() {
  50.         int i;
  51.         for(i = 0; i < vi.size(); ++i) vi[i].info();
  52.         for(i = 0; i < va.size(); ++i) va[i].info();
  53.         for(i = 0; i < vh.size(); ++i) vh[i].info();
  54.         for(i = 0; i < vc.size(); ++i) vc[i].info();
  55.         for(i = 0; i < ve.size(); ++i) ve[i].info();
  56.     }
  57. };
  58.  
  59. class ArmyBuilder {
  60. protected:
  61.     Army *p;
  62. public:
  63.     ArmyBuilder() : p(0) { }
  64.     virtual ~ArmyBuilder() {}
  65.         virtual void createArmy() {}
  66.         virtual void buildInfantryman() {}
  67.         virtual void buildArcher() {}
  68.         virtual void buildHorseman() {}
  69.         virtual void buildCatapult() {}
  70.         virtual void buildElephant() {}
  71.         virtual Army* getArmy() { return p; }
  72. };
  73.  
  74. class RomanArmyBuilder: public ArmyBuilder {
  75.   public:
  76.     void createArmy() { p = new Army; }
  77.     void buildInfantryman() { p->vi.push_back( Infantryman()); }
  78.     void buildArcher() { p->va.push_back( Archer()); }
  79.     void buildHorseman() { p->vh.push_back( Horseman()); }
  80.     void buildCatapult() { p->vc.push_back( Catapult()); }
  81. };
  82.  
  83. class CarthaginianArmyBuilder: public ArmyBuilder {
  84.   public:
  85.     void createArmy() { p = new Army; }
  86.     void buildInfantryman() { p->vi.push_back( Infantryman()); }
  87.     void buildArcher() { p->va.push_back( Archer()); }
  88.     void buildHorseman() { p->vh.push_back( Horseman()); }
  89.     void buildElephant() { p->ve.push_back( Elephant()); }
  90. };
  91.  
  92. class Director {
  93. public:
  94.     Army* createArmy(ArmyBuilder &builder) {
  95.         builder.createArmy();
  96.         builder.buildInfantryman();
  97.         builder.buildArcher();
  98.         builder.buildHorseman();
  99.         builder.buildCatapult();
  100.         builder.buildElephant();
  101.         return(builder.getArmy());
  102.     }
  103. };
  104.  
  105. int main() {
  106.     Director dir;
  107.     RomanArmyBuilder ra_builder;
  108.     CarthaginianArmyBuilder ca_builder;
  109.  
  110.     Army *ra = dir.createArmy(ra_builder);
  111.     Army *ca = dir.createArmy(ca_builder);
  112.     cout << "Roman army:" << endl;
  113.     ra->info();
  114.     cout << "\nCarthaginian army:" << endl;
  115.     ca->info();
  116.  
  117.     return 0;
  118. }
Advertisement
Add Comment
Please, Sign In to add comment