工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到了其子类。
之前的简单工厂模式虽说也非常好,但是在添加和更改生产选项的时候,不得不更改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;
}