工厂模式实例化不同的类

文章描述了使用C++实现的一种设计模式,通过工厂类LaserFactory根据传入的参数动态实例化子类(如LaserCtrlBios488和LaserCommProcBios488),并利用抽象类和虚函数实现功能复用和灵活性。
摘要由CSDN通过智能技术生成

       设计思路:工厂类实例化子类

       将子类功能总和建立新的父类,将父类共有的功能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;
}
  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值