简单写了一个工厂模式
在这种模式下,有新增的类时,FileAccessFasctory.h 和FileWork,cpp这两个文件是稳定的,不需要修改,只需要修改FileAccess.h和FileAccess.cpp,或者新增文件,这样就在业务逻辑中隔离变化;同时也可以实现增量编译,也不会影响业务代码的单元测试。
FileAccessFasctory.h
#ifndef _FILE_ACCESS_FACTORY_H
#define _FILE_ACCESS_FACTORY_H
class IfileAccess{
public:
virtual void open() = 0;
virtual void read() = 0;
//....
virtual ~IfileAccess(){}
};
class IfileAccessFactory{
public:
virtual IfileAccess* createFileAccess()= 0;
virtual ~IfileAccessFactory(){}
};
#endif
FileWork,cpp
#include "FileAccess.h"
class fileWork{
private:
IfileAccessFactory *fileAccessFactory;
public:
fileWork(IfileAccessFactory *fileAccessFactory){
this->fileAccessFactory = fileAccessFactory;
}
void doWork(){
IfileAccess * fileAccess = fileAccessFactory->createFileAccess();
fileAccess->open();
fileAccess->read();
}
};
FileAccess.h
#ifndef _FILE_ACCESS_H
#define _FILE_ACCESS_H
#include "FileAccessFactory.h"
using namespace std;
class textFileAccess : public IfileAccess{
public:
virtual void open() override;
virtual void read() override;
};
class pictureFileAccess : public IfileAccess{
public:
virtual void open() override;
virtual void read() override;
};
class videoFileAccess : public IfileAccess{
public:
virtual void open() override;
virtual void read() override;
};
class audioFileAccess : public IfileAccess{
public:
virtual void open() override;
virtual void read() override;
};
class textFileAccessFactory : public IfileAccessFactory{
public:
virtual IfileAccess* createFileAccess()override;
};
class pictureFileAccessFactory : public IfileAccessFactory{
public:
virtual IfileAccess* createFileAccess()override;
};
class videoFileAccessFactory : public IfileAccessFactory{
public:
virtual IfileAccess* createFileAccess()override;
};
class audioFileAccessFactory : public IfileAccessFactory{
public:
virtual IfileAccess* createFileAccess()override;
};
#endif
FileAccess.cpp
#include "FileAccess.h"
#include <iostream>
using namespace std;
void textFileAccess::open(){
cout<<"open text file"<<endl;
}
void textFileAccess::read(){
cout<<"read text file"<<endl;
}
void pictureFileAccess::open(){
cout<<"open picture file"<<endl;
}
void pictureFileAccess::read(){
cout<<"read picture file"<<endl;
}
void videoFileAccess::open(){
cout<<"open video file"<<endl;
}
void videoFileAccess::read(){
cout<<"read video file"<<endl;
}
void audioFileAccess::open(){
cout<<"open audio file"<<endl;
}
void audioFileAccess::read(){
cout<<"read audio file"<<endl;
}
IfileAccess*textFileAccessFactory::createFileAccess(){
return new textFileAccess();
}
IfileAccess* pictureFileAccessFactory::createFileAccess(){
return new pictureFileAccess();
}
IfileAccess* videoFileAccessFactory:: createFileAccess(){
return new videoFileAccess();
}
IfileAccess* audioFileAccessFactory:: createFileAccess(){
return new audioFileAccess();
}
main.cpp
#include "FileWork.cpp"
int main(){
textFileAccessFactory *ptTextFileAccessFactory = new textFileAccessFactory();
fileWork work(ptTextFileAccessFactory);
work.doWork();
pictureFileAccessFactory *ptPictureFileAccessFactory = new pictureFileAccessFactory();
fileWork work1(ptPictureFileAccessFactory);
work1.doWork();
return 0;
}