定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
main.cc:
#include "nike_factory.h" #include "asics_factory.h" #include "nike_running_shoe.h" #include "asics_running_shoe.h" #include <windows.h> /* design_pattern:factory_method */ int main(){ Factory *nike_factory = new NikeFactory(); Factory *asics_factory = new AsicsFactory(); RunningShoe *nike_running_shoe = nike_factory->CreateRunningShoe(); RunningShoe *asics_running_shoe = asics_factory->CreateRunningShoe(); nike_running_shoe->run(); asics_running_shoe->run(); //clear delete nike_factory; delete asics_factory; delete nike_running_shoe; delete asics_running_shoe; system("Pause"); return 0; }Factory:
//factory.h #ifndef HELENDP_SOURCE_FACTORY_H_ #define HELENDP_SOURCE_FACTORY_H_ #include "running_shoe.h" class Factory{ public: Factory(); virtual ~Factory(); virtual RunningShoe *CreateRunningShoe() = 0; }; #endif //factory.cc #include "factory.h" Factory::Factory(){ } Factory::~Factory(){ }AsicsFactory:
//asics_factory.h #ifndef HELENDP_SOURCE_ASICS_FACTORY_H_ #define HELENDP_SOURCE_ASICS_FACTORY_H_ #include "factory.h" class AsicsFactory : public Factory{ public: AsicsFactory(); ~AsicsFactory(); RunningShoe *CreateRunningShoe(); }; #endif //asics_factory.cc #include "asics_factory.h" #include "asics_running_shoe.h" AsicsFactory::AsicsFactory(){ } AsicsFactory::~AsicsFactory(){ } RunningShoe *AsicsFactory::CreateRunningShoe(){ return new AsicsRunningShoe(); }NikeFactory:
//nike_factory.h #ifndef HELENDP_SOURCE_NIKE_FACTORY_H_ #define HELENDP_SOURCE_NIKE_FACTORY_H_ #include "factory.h" class NikeFactory : public Factory{ public: NikeFactory(); ~NikeFactory(); RunningShoe *CreateRunningShoe(); }; #endif //nike_factory.cc #include "nike_factory.h" #include "nike_running_shoe.h" NikeFactory::NikeFactory(){ } NikeFactory::~NikeFactory(){ } RunningShoe* NikeFactory::CreateRunningShoe(){ return new NikeRunningShoe(); }RunningShoe:
//running_shoe.h #ifndef HELENDP_SOURCE_RUNNING_SHOE_H_ #define HELENDP_SOURCE_RUNNING_SHOE_H_ class RunningShoe { public: RunningShoe(); virtual ~RunningShoe(); virtual void run() = 0; }; #endif //running_shoe.cc #include "running_shoe.h" RunningShoe::RunningShoe(){ } RunningShoe::~RunningShoe(){ }AsicsRunningShoe:
//asics_running_shoe.h #ifndef HELENDP_SOURCE_ASICS_RUNNING_SHOE_H_ #define HELENDP_SOURCE_ASICS_RUNNING_SHOE_H_ #include "running_shoe.h" class AsicsRunningShoe : public RunningShoe { public: AsicsRunningShoe(); ~AsicsRunningShoe(); void run(); }; #endif //asics_running_shoe.cc #include "asics_running_shoe.h" #include <iostream> using namespace std; AsicsRunningShoe::AsicsRunningShoe(){ } AsicsRunningShoe::~AsicsRunningShoe(){ } void AsicsRunningShoe::run(){ cout << "Asics Run!" << endl; }NikeRunningShoe:
//nike_running_shoe.h #ifndef HELENDP_SOURCE_NIKE_RUNNING_SHOE_H_ #define HELENDP_SOURCE_NIKE_RUNNING_SHOE_H_ #include "running_shoe.h" class NikeRunningShoe : public RunningShoe{ public: NikeRunningShoe(); ~NikeRunningShoe(); void run(); }; #endif //nike_running_shoe.cc #include "nike_running_shoe.h" #include <iostream> using namespace std; NikeRunningShoe::NikeRunningShoe(){ } NikeRunningShoe::~NikeRunningShoe(){ } void NikeRunningShoe::run(){ cout << "Nike Run!" << endl; }代码和UML图(EA)工程文件,最后会整理打包上传.
