设计模式之简单工厂类

工厂类

#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而没有进行内存释放

posted @ 2019-08-28 09:48  N_zero  阅读(170)  评论(0)    收藏  举报