fork download
  1. #include <iostream>
  2. #include <memory>
  3.  
  4. class AbstractBase {
  5. public:
  6. virtual void foo() = 0;
  7. virtual ~AbstractBase() = default;
  8. };
  9.  
  10. class A : public AbstractBase {
  11. public:
  12. void foo() override { std::cout << "Class A: foo() called" << std::endl; }
  13. };
  14.  
  15. class B : public AbstractBase {
  16. public:
  17. void foo() override { std::cout << "Class B: foo() called" << std::endl; }
  18. };
  19.  
  20. class FooDecorator : public AbstractBase {
  21. public:
  22. FooDecorator(AbstractBase *pBase): mpBase(pBase) { }
  23. void foo() override
  24. {
  25. mpBase->foo();
  26. ++mNumberOfFooCalls;
  27. }
  28. static int getFooCalls() { return mNumberOfFooCalls; }
  29.  
  30. private:
  31. static int mNumberOfFooCalls;
  32. AbstractBase *mpBase;
  33. };
  34.  
  35. class AbstractFactory {
  36. public:
  37. virtual std::unique_ptr<AbstractBase> createA() = 0;
  38. virtual std::unique_ptr<AbstractBase> createB() = 0;
  39. virtual ~AbstractFactory() = default;
  40. };
  41.  
  42. class CountingFactory : public AbstractFactory {
  43. public:
  44. std::unique_ptr<AbstractBase> createA()
  45. {
  46. // auto pA = new A();
  47. // return std::unique_ptr<AbstractBase>(new FooDecorator(pA));
  48. std::unique_ptr<AbstractBase> pA(new A());
  49. return std::unique_ptr<AbstractBase>(new FooDecorator(pA.release()));
  50. }
  51.  
  52. std::unique_ptr<AbstractBase> createB()
  53. {
  54. // auto pB = new B();
  55. // return std::unique_ptr<AbstractBase>(new FooDecorator(pB));
  56. std::unique_ptr<AbstractBase> pB(new B());
  57. return std::unique_ptr<AbstractBase>(new FooDecorator(pB.release()));
  58. }
  59. };
  60.  
  61. int FooDecorator::mNumberOfFooCalls = 0;
  62.  
  63. int main()
  64. {
  65. std::unique_ptr<AbstractFactory> pFactory(new CountingFactory());
  66. std::unique_ptr<AbstractBase> pObjA = pFactory->createA();
  67. std::unique_ptr<AbstractBase> pObjB = pFactory->createB();
  68. pObjA->foo();
  69. pObjB->foo();
  70. std::cout << "Foo called " << FooDecorator::getFooCalls()
  71. << " times." << std::endl;
  72. }
Success #stdin #stdout 0s 3276KB
stdin
Standard input is empty
stdout
Class A: foo() called
Class B: foo() called
Foo called 2 times.