jack06215

[tutorial] Abstract factory pattern

Jul 17th, 2020 (edited)
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.59 KB | None | 0 0
  1. #include <string>
  2. #include <iostream>
  3.  
  4.  
  5. /* Common utility */
  6. bool icompare_pred(unsigned char a, unsigned char b)
  7. {
  8.     return std::tolower(a) == std::tolower(b);
  9. }
  10.  
  11. bool icompare(std::string const& a, std::string const& b)
  12. {
  13.     if (a.length() == b.length()) {
  14.         return std::equal(b.begin(), b.end(),
  15.             a.begin(), icompare_pred);
  16.     }
  17.     else {
  18.         return false;
  19.     }
  20. }
  21.  
  22. /* Base code for car factory */
  23. class ICar
  24. {
  25. public:
  26.     virtual std::string GetModel() = 0;
  27.     virtual std::string GetMaker() = 0;
  28. };
  29.  
  30. class ICarFactory
  31. {
  32. public:
  33.     virtual ICar* GetRacingCar() = 0;
  34.     virtual ICar* GetSedan() = 0;
  35.     virtual ICar* GetHatch() = 0;
  36. };
  37.  
  38. /* Holden and its car range*/
  39. namespace Holden
  40. {
  41.  
  42.     class IHoldenCar
  43.     {
  44.     public:
  45.         virtual std::string GetModel() = 0;
  46.  
  47.         virtual std::string GetMaker()
  48.         {
  49.             return "Holden";
  50.         }
  51.     };
  52.  
  53. }
  54.  
  55. namespace Holden
  56. {
  57.  
  58.     class CCommodore : public IHoldenCar
  59.     {
  60.     public:
  61.         std::string GetModel()
  62.         {
  63.             return std::string("Commodore");
  64.         }
  65.     };
  66.  
  67. }
  68.  
  69. namespace Holden
  70. {
  71.     class CBarina : public IHoldenCar
  72.     {
  73.     public:
  74.         std::string GetModel()
  75.         {
  76.             return std::string("Barina");
  77.         }
  78.     };
  79. }
  80.  
  81. namespace Holden
  82. {
  83.  
  84.     class CMonaro : public IHoldenCar
  85.     {
  86.     public:
  87.         std::string GetModel()
  88.         {
  89.             return std::string("Monaro");
  90.         }
  91.     };
  92.  
  93. }
  94.  
  95. /* Ford and its car range*/
  96. namespace Ford
  97. {
  98.  
  99.     class IFordCar
  100.     {
  101.     public:
  102.         virtual std::string GetModel() = 0;
  103.  
  104.         virtual std::string GetMaker()
  105.         {
  106.             return "Ford";
  107.         }
  108.     };
  109.  
  110. }
  111.  
  112. namespace Ford
  113. {
  114.  
  115.     class CBaddGT : public IFordCar
  116.     {
  117.     public:
  118.         std::string GetModel()
  119.         {
  120.             return std::string("Badd GT");
  121.         }
  122.     };
  123.  
  124. }
  125.  
  126. namespace Ford
  127. {
  128.  
  129.     class CFalcon : public IFordCar
  130.     {
  131.     public:
  132.         std::string GetModel()
  133.         {
  134.             return std::string("Falcon");
  135.         }
  136.     };
  137.  
  138. }
  139.  
  140. namespace Ford
  141. {
  142.  
  143.     class CFocus : public IFordCar
  144.     {
  145.     public:
  146.         std::string GetModel()
  147.         {
  148.             return std::string("Focus");
  149.         }
  150.     };
  151.  
  152. }
  153.  
  154. /* Holden car factory */
  155. class CHoldenCarFactory : public ICarFactory
  156. {
  157. public:
  158.     ICar* GetRacingCar()
  159.     {
  160.         return (ICar*)(new Holden::CMonaro());
  161.     }
  162.  
  163.     ICar* GetSedan()
  164.     {
  165.         return (ICar*)(new Holden::CCommodore());
  166.     }
  167.  
  168.     ICar* GetHatch()
  169.     {
  170.         return (ICar*)(new Holden::CBarina());
  171.     }
  172. };
  173.  
  174.  
  175. /* Ford car factory */
  176. class CFordCarFactory : public ICarFactory
  177. {
  178. public:
  179.     ICar* GetRacingCar()
  180.     {
  181.         return (ICar*)(new Ford::CBaddGT());
  182.     }
  183.  
  184.     ICar* GetSedan()
  185.     {
  186.         return (ICar*)(new Ford::CFalcon());
  187.     }
  188.  
  189.     ICar* GetHatch()
  190.     {
  191.         return (ICar*)(new Ford::CFocus());
  192.     }
  193. };
  194.  
  195. /* Abstract factory */
  196. class CAbstractFactory
  197. {
  198. public:
  199.     ICarFactory* GetCarFactory(std::string choice)
  200.     {
  201.         if (icompare(choice, "Ford"))
  202.             return (ICarFactory*)(new CFordCarFactory());
  203.  
  204.         else if (icompare(choice, "Holden"))
  205.             return (ICarFactory*)(new CHoldenCarFactory());
  206.     }
  207. };
  208.  
  209. int main(void)
  210. {
  211.     CAbstractFactory kAbstractFactory;
  212.  
  213.     ICarFactory* pkFactory = kAbstractFactory.GetCarFactory("Holden");
  214.     ICar* pkRacing = pkFactory->GetSedan();
  215.  
  216.     std::cout << pkRacing->GetMaker() << "\n" << pkRacing->GetModel() << " " << std::endl;
  217.  
  218.     return 0;
  219. }
Add Comment
Please, Sign In to add comment