设计思路:工厂类实例化子类
将子类功能总和建立新的父类,将父类共有的功能virtal = 0;其余virtal 与函数化。
实现:调用时实例化对象,且由传入初始化参数确定实例化和初始化哪个子类。
工厂类 LaserFactory.h
#include "LaserUartCtrlBios488.h"
#include "AbstractLaser.h"
class CLaserFactory //工厂类 负责实例化需要实例化的子类
{
public:
CLaserFactory()
{
return;
}
CAbstractLaser *CreateLaser(string iLaserType, const string & iDriveFile, int iBaudRate) //创建实例化函数 传入参数根据需求,进行实例化不同类
{
if (iLaserType == "Bios-488-50D")
{
return new CLaserCtrlBios488(iDriveFile, iBaudRate);
}
else
{
return NULL;
}
}
};
主类 AbstractLaser.h
#include "structInfo.h"
using namespace std;
class CAbstractLaser
{
public:
// CAbstractLaser();
// CLaserCtrlBios488(const string & iDriveFile, int iBaudRate);
virtual ~CAbstractLaser(); //虚函数后续子类重写
virtual int iInitialize() = 0;
virtual int iPrintf() = 0;
};
AbstractLaser.cpp
#include<string>
#include<iostream>
using namespace std;
#include "AbstractLaser.h"
//CAbstractLaser::CAbstractLaser();
//CLaserCtrlBios488(const string & iDriveFile, int iBaudRate)
//{ ;}
CAbstractLaser::~CAbstractLaser()
{
return;
}
int CAbstractLaser::iInitialize()
{
return 1;
}
int CAbstractLaser::iPrintf()
{
return 1;
}
子类LaserCommProcBios488.h
#include <stdint.h>
#include "LaserUartCtrlBios488.h"
class CLaserCommProcBios488 :public CAbstractLaser //子类
{
public:
// 构造函数
CLaserCommProcBios488(const string & iDriveFile, int iBaudRate);
// 析构函数
~CLaserCommProcBios488();
// 初始化
int iInitialize();
int iPrintf();
private:
// 激光器串口控制
CLaserUartCtrlBios488 m_laserUartCtrl;
};
LaserCommProcBios488.cpp
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include "LaserUartCtrlBios488.h"
#include "LaserCommProcBios488.h"
using namespace std;
// 构造函数
CLaserCommProcBios488::CLaserCommProcBios488(const string & iDriveFile, int iBaudRate)
:m_laserUartCtrl(iDriveFile, iBaudRate)
{
return;
}
// 析构函数
CLaserCommProcBios488::~CLaserCommProcBios488()
{
return;
}
// 初始化
int CLaserCommProcBios488::iInitialize()
{
// 初始化串口
if (EXIT_FAILURE == m_laserUartCtrl.iInitialize())
{
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
int CLaserCommProcBios488::iPrintf()
{
printf("CLaserCommProBios488");
return EXIT_SUCCESS;
}
子类LaserCtrlBios488.h
#include "LaserUartCtrlBios488.h"
//#include "InnerDeviceInfo.h"
#include "LaserCommProcBios488.h"
//class DLaserCtrl :public CThreadProc
#include "structInfo.h"
#include "AbstractLaser.h"
class CLaserCtrlBios488 :public CAbstractLaser //子类
{
public:
// 构造函数
CLaserCtrlBios488(const string & iDriveFile, int iBaudRate);
CLaserCtrlBios488() = default;
// 析构函数
~CLaserCtrlBios488();
// 初始化
virtual int iInitialize();
int iPrintf();
private:
// 激光器通信处理
CLaserCommProcBios488 m_laserCommProc;
};
LaserCtrlBios488.cpp
#include <unistd.h>
#include <stdlib.h>
#include "LaserCtrlBios488.h"
#include <string>
// 构造函数
CLaserCtrlBios488::CLaserCtrlBios488(const string & iDriveFile, int iBaudRate)
:m_laserCommProc(iDriveFile, iBaudRate)
{
return;
}
// 析构函数
CLaserCtrlBios488::~CLaserCtrlBios488()
{
return;
}
// 初始化
int CLaserCtrlBios488::iInitialize()
{
// 初始化串口
if (EXIT_FAILURE == m_laserCommProc.iInitialize())
{
printf("initialize erro");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
int CLaserCtrlBios488::iPrintf()
{
printf("CLaserCtrlBios488");
return EXIT_SUCCESS;
}
main.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include "LaserUartCtrlBios488.h"
#include "LaserCommProcBios488.h"
#include "LaserCtrlBios488.h"
#include "LaserFactory.h"
#include "AbstractLaser.h"
using namespace std;
int main()
{
const string sDriverFile = "/dev/ttyACM0";
int iBaudRate = 115200;
string iDriveName = "Bios-488-50D";
CLaserFactory * factory = new CLaserFactory;
CAbstractLaser *Laser = factory->CreateLaser(iDriveName, sDriverFile, iBaudRate);
if (EXIT_FAILURE == Laser->iInitialize())
{
printf("LaserInitialize erro");
return EXIT_FAILURE;
}
Laser->iPrintf();
delete Laser;
delete factory;
cout << "succeed" << endl;
return EXIT_SUCCESS;
}
第二种方法main.cpp
#include <iostream>
#include <string>
#include "LaserCtrProc.h"
#include "CLaserCtrl.h"
#include "LaserUartCtrl_1.h"
#include "UartCtrl.h"
using namespace std;
CLaserCtrlProc *CLaserCtrlProc::p = NULL;
CLaserCtrl *CLaserCtrlProc::m_plaserctrl = NULL;
int main()
{
CLaserCtrlProc *instance = CLaserCtrlProc::GetInstance();
int ret = instance->iInitialize();
instance->test();
return 0;
}