工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到了其子类。
之前的简单工厂模式虽说也非常好,但是在添加和更改生产选项的时候,不得不更改switch和case语句,这点违背了设计模式的开方--封闭的原则。
工厂方法模式,既克服了简单工厂违背开方--封闭原则的缺点,又保持了封装对象创建过程的优点。
两种模式都是集中封装了对象的创建,使得要更换对象时,不需要做出大的改动就可以实现,降低了客户程序和产品对象的耦合。工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的有点,而且克服了它的缺点。但缺点是由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。
#include <iostream> #include <string> using namespace std; class LeiFeng //雷锋类 { public: void Sweep() //扫地 { cout<<"扫地"<<endl; } void Wash() //洗衣 { cout<<"洗衣"<<endl; } void Cook() //煮饭 { cout<<"煮饭"<<endl; } }; class Undergraduate : public LeiFeng //大学生类 继承于雷锋类 {}; class Volunteer : public LeiFeng //志愿者类 继承于雷锋类 {}; /* class SimpleFactory //简单工厂方法 { LeiFeng* leifeng; public: LeiFeng* createLeifeng(string type) { if(type == "学雷锋的大学生") { leifeng = new Undergraduate; } else if(type == "社区志愿者") { leifeng = new Volunteer; } return leifeng; } }; */ class Factory //工厂方法 工厂基类 { public: virtual LeiFeng* createLeifeng(){} //创建雷锋实例的虚函数 }; class UndergraduateFactory : public Factory //大学生雷锋 工厂类 { public: LeiFeng* createLeifeng() //创建大学生雷锋 { return (new Undergraduate); } }; class VolunteerFactory : public Factory //志愿者雷锋 工厂类 { public: LeiFeng* createLeifeng() //创建志愿者雷锋 { return (new Volunteer); } }; int main() { /* SimpleFactory S; LeiFeng* student1 = S.createLeifeng("学雷锋的大学生"); student1->Sweep(); LeiFeng* student2 = S.createLeifeng("学雷锋的大学生"); student2->Wash(); LeiFeng* student3 = S.createLeifeng("学雷锋的大学生"); student3->Cook(); */ Factory* factory = new UndergraduateFactory; //工厂基类指针 指向 大学生雷锋工厂类 LeiFeng* student1 = factory->createLeifeng(); //工厂基类指针 访问 大学生雷锋工厂类 createLeifeng函数 LeiFeng* student2 = factory->createLeifeng(); //工厂基类指针 访问 大学生雷锋工厂类 createLeifeng函数 LeiFeng* student3 = factory->createLeifeng(); //工厂基类指针 访问 大学生雷锋工厂类 createLeifeng函数 student1->Sweep(); //大学生雷锋类对象 访问 雷锋类函数 student2->Wash(); //大学生雷锋类对象 访问 雷锋类函数 student3->Cook(); //大学生雷锋类对象 访问 雷锋类函数 return 0; }