工廠方法模式(Factory Method):定義一個用於建立物件的接口,讓子類別去實例化哪一個類,工廠方法使一個類別的實例化延遲到其子類別。
與簡單工廠的區別:簡單工廠需要修改原有類,違反了開閉原則。而工廠方法就避免類這個問題。保持了封裝物件的創建過程的優點,只需增加工廠類別就可以,解決了簡單工廠分支判斷的問題。
工廠方法模式包含四個角色:
Product:抽象產品
ConcreteProduct: 特定產品
Factory: 抽象工廠
Concrete
在此以學雷鋒為例,運用工廠方法模式,將雷鋒的方法視為抽象產品,對應抽象工廠; 學雷鋒的人視為具體產品, 對應具體工廠。如要新增學雷鋒的人員類別只需新增對應的類,而不需要修改原有類。
[code]int main(){ //工厂方法 IFactory *factory = new UnderGraduateFactory; //new一个大学生工厂 //创建学雷锋的学生 LeiFeng *student = factory->createLeiFeng(); //学生干了哪些雷锋方法 student->BuyRice(); //买米 student->Sweep(); //扫地 student->Wash(); //清洗 return 0; }
[code]class LeiFeng{ public: virtual void BuyRice(){ std::cout << "Buy rice.\n"; } virtual void Sweep(){ std::cout << "Sweep.\n"; } virtual void Wash(){ std::cout << "Wash.\n"; } };
學雷鋒的人(具體產品):
[code]class UnderGraduate: public LeiFeng{ }; //学雷锋的志愿者(具体产品) class Volunteer: public LeiFeng{ };
[code]class IFactory{ public: //创建学雷锋对象 virtual LeiFeng* createLeiFeng(){ return NULL; } };
[code]class UnderGraduateFactory: public IFactory{ LeiFeng* createLeiFeng(){ return new UnderGraduate; } }; class VolunteerFactory: public IFactory{ LeiFeng* createLeiFeng(){ return new Volunteer; } };