(五)工厂方法模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟其子类。
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,取出来与具体产品的依赖。
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想要加功能,本来是改工厂类的,而现在是修改客户端。
工厂方法克服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。
#include <string>
#include <iostream>
using namespace std;
//(五)工厂方法模式
//定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟其子类。
//简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,取出来与具体产品的依赖。
//工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。
//你想要加功能,本来是改工厂类的,而现在是修改客户端。
//工厂方法克服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。
//实例基类,相当于Product(为了方便,没用抽象)
class LeiFeng
{
public:
virtual void Sweep()
{
cout<<"雷锋扫地"<<endl;
}
};
//学雷锋的大学生,相当于ConcreteProduct
class Student: public LeiFeng
{
public:
virtual void Sweep()
{
cout<<"大学生扫地"<<endl;
}
};
//学雷锋的志愿者,相当于ConcreteProduct
class Volenter: public LeiFeng
{
public :
virtual void Sweep()
{
cout<<"志愿者扫地"<<endl;
}
};
//工场基类Creator
class LeiFengFactory
{
public:
virtual LeiFeng* CreateLeiFeng()
{
return new LeiFeng();
}
};
//工场具体类
class StudentFactory : public LeiFengFactory
{
public :
virtual LeiFeng* CreateLeiFeng()
{
return new Student();
}
};
class VolenterFactory : public LeiFengFactory
{
public:
virtual LeiFeng* CreateLeiFeng()
{
return new Volenter();
}
};
//客户端
int main()
{
LeiFengFactory *sf;
LeiFeng *s;
string person[3]={"雷锋","大学生","志愿者"};
for(int i=0;i<3;i++)
cout<<i+1<<": "<<person[i]<<"\n";
cout<<"选择编号:";
unsigned int index;
while (cin>>index)
{
switch(index)
{
case 1:
sf=new LeiFengFactory();
break;
case 2:
sf=new StudentFactory();
break;
case 3:
sf=new VolenterFactory();
break;
default:
sf=new LeiFengFactory();
break;
}
s=sf->CreateLeiFeng();
s->Sweep();
delete s;
delete sf;
cout<<"选择编号:";
}
return 0;
}