设计模式之简单工厂类
工厂类
#pragma once
//#include "Operation.h" //2019.10.17 工厂类中不需要引入基类头文件
#include "OperationAdd.h"
#include "OperationDiv.h"
#include "OperationMul.h"
#include "OperationSub.h" //2019.11.27 这四个派生类的头文件,可以放到工厂类的实现文件里。而这里需要添加基类的类声明。
#include <string>
using namespace std;
class OperationFactory
{
public:
OperationFactory();
virtual ~OperationFactory();
public:
Operation * createOperate(char operate);
};
#include "pch.h"
#include "OperationFactory.h"
OperationFactory::OperationFactory()
{
}
OperationFactory::~OperationFactory()
{
}
Operation * OperationFactory::createOperate(char operate)
{
Operation * pOper; //2019.11.27 可以看到这里是局部的指针,根据下面的switch可以推断这样会一起内存泄漏。这里可以将Operation改成成员变量,然后在析构函数里对其进行释放
switch (operate)
{
case '+':
pOper = new OperationAdd();
break;
case '-':
pOper = new OperationSub();
break;
case '*':
pOper = new OperationMul();
break;
case '/':
pOper = new OperationDiv();
break;
default:
break;
}
return pOper;
}
测试
#include "pch.h"
#include <iostream>
#include "OperationFactory.h"
#include "Operation.h"
int main()
{
OperationFactory factory;
Operation * pOper;
pOper = factory.createOperate('*');
pOper->SetNumberA(6);
pOper->SetNumberB(2);
double res = pOper->GetResult();
std::cout << res << std::endl;
//内存释放。2019.11.27 这种内存释放不规范,导致这种不规范的原因是工厂类没有写好。
if (pOper) { delete pOper; pOper = NULL; }
std::cout << "Hello World!\n"; getchar(); }
2019.11.27 通过上面的代码可以看出,编码上存在不少问题。
1.对于类头文件和类的前置声明,完全没有注意它们的使用
2.随意使用局部指针变量,并进行new而没有进行内存释放

浙公网安备 33010602011771号