diff --git a/examples/creational/factory_method.cpp b/examples/creational/factory_method.cpp new file mode 100644 index 0000000..4057dcc --- /dev/null +++ b/examples/creational/factory_method.cpp @@ -0,0 +1,69 @@ +#include +#include + +class Interviewer +{ + public: + typedef std::shared_ptr ptr_t; + virtual void askQuestions(void) = 0; +}; + +class Developer : public Interviewer +{ + public: + void askQuestions(void) + { + std::cout << "Asking about design patterns!" << std::endl; + } +}; + +class CommunityExecutive : public Interviewer +{ + public: + void askQuestions(void) + { + std::cout << "Asking about community building!" << std::endl; + } +}; + +class HiringManager +{ + public: + void takeInterview(void) + { + Interviewer::ptr_t interviewer = makeInterviewer(); + interviewer->askQuestions(); + } + + protected: + virtual Interviewer::ptr_t makeInterviewer(void) = 0; +}; + +class DevelopmentManager : public HiringManager +{ + protected: + Interviewer::ptr_t makeInterviewer(void) + { + return std::make_shared(); + } +}; + +class MarketingManager : public HiringManager +{ + protected: + Interviewer::ptr_t makeInterviewer(void) + { + return std::make_shared(); + } +}; + +int main() +{ + DevelopmentManager developmentManager = DevelopmentManager(); + developmentManager.takeInterview(); // Output: Asking about design patterns! + + MarketingManager marketingManager = MarketingManager(); + marketingManager.takeInterview(); // Output: Asking about community building! + + return 0; +}