前面的文章详细介绍了单例模式和简单工厂模式,有需要的可以点击链接去看看。之前说到,简单工厂模式有一个最大的弊端就是它违背了开放封闭原则,因为如果需要新增功能,则需要工厂类的内部,这违背了对修改关闭的设计原则。为了解决这个问题,工厂方法模式就诞生了。
工厂方法:定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。通俗一点讲工厂方法和简单工厂的区别在于:简单工厂只有一个工厂类,且其中包含了所有可能的操作,根据传入参数的不同返回不同的对象,而工厂方法中,除了有一个工厂类(基类)之外,每个功能还存在一个派生类,客户可以根据自己的需求去实例化不同的对象。
#include<iostream>
using namespace std;
//工厂方法模式:定一个一个创建对象的接口,让子类决定实例化那一个类。工厂方法使一个类的实例化延迟到子类
//如果增加新的功能,则只需要增加该操作类和该操作的工厂类,这样全程就对修改关闭了
//操作类
class Operation {
private:
int numberA;
int numberB;//两个私有数据
public:
//四个公有方法来设置和获取数据
int getNumberA()
{
return numberA;
}
void setNumberA(int value)
{
numberA = value;
}
int getNumberB()
{
return numberB;
}
void setNumberB(int value)
{
numberB = value;
}
virtual int getresult() = 0;//纯虚函数
};
//加法类
class Add :public Operation {
public:
int getresult()
{
return getNumberA() + getNumberB();
}
};
//减法类
class Sub :public Operation {
public:
int getresult()
{
return getNumberA() - getNumberB();
}
};
//除法类
class Div :public Operation {
public:
int getresult()
{
if (getNumberB() == 0)
{
cout << "除数不能为0" << endl;
return 0;
}
return getNumberA() / getNumberB();
}
};
//乘法类
class Prod :public Operation {
public:
int getresult()
{
return getNumberA() * getNumberB();
}
};
//工厂基类(简单工厂只有这一个工厂类,实例化也在该类中)
class Factoryoper {
public:
virtual Operation* createOperation() = 0;//纯虚函数
};
//工厂方法是需要哪个功能就实例化哪个对象,让客户去决定,派生出具体的功能类
//加法工厂
class addFactory :public Factoryoper {
public:
Operation* createOperation()
{
return new Add();
}
};
//减法工厂
class subFactory :public Factoryoper {
public:
Operation* createOperation()
{
return new Sub();
}
};
//除法工厂
class divFactory :public Factoryoper {
public:
Operation* createOperation()
{
return new Div();
}
};
//乘法工厂
class prodFactory :public Factoryoper {
public:
Operation* createOperation()
{
return new Prod();
}
};
int main()
{
Factoryoper* operFactory1 = new addFactory();//加法工厂
Operation* oper1 = operFactory1->createOperation();//加法实例
oper1->setNumberA(10);
oper1->setNumberB(20);
int res = oper1->getresult();//得到结果
cout << res << endl;
Factoryoper* operFactory2 = new subFactory();
Operation* oper2 = operFactory2->createOperation();
oper2->setNumberA(10);
oper2->setNumberB(20);
cout << oper2->getresult()<< endl;
Factoryoper* operFactory3 = new divFactory();
Operation* oper3 = operFactory3->createOperation();
oper3->setNumberA(60);
oper3->setNumberB(3);
cout << oper3->getresult() << endl;
Factoryoper* operFactory4 = new prodFactory();
Operation* oper4 = operFactory4->createOperation();
oper4->setNumberA(60);
oper4->setNumberB(3);
cout << oper4->getresult() << endl;
system("pause");
return 0;
}
代码中关键地方都注释了,相信大家也能看懂,欢迎交流讨论哈。