前一篇文章介绍了简单工厂模式,提到了简单工厂模式的缺点(违反开闭原则,扩展困难),本文要介绍的工厂方法模式在一定程度上弥补了简单工厂模式的缺点。
工厂方法模式是创建型设计模式之一,它在抽象工厂类中声明创建对象的接口,在具体工厂类中实现具体的实例化过程。这个模式的核心思想是将对象的实例化延迟到子类中进行,从而使得父类通过其子类来指定创建哪个对象,实现了类的实例化操作的封装和数据的封装。
这样的话,当要添加一个具体产品时,我们不会修改原有的工厂类(不违反开闭原则),而是新创建一个关联于具体产品的具体工厂类(易扩展)。
抽象相机类:CameraDevice
具体相机类:BaslerCameraDevice,SickCameraDevice,HuarayCameraDevice
抽象工厂类:CameraDeviceFactory
具体工厂类:BaslerCameraFactory,SickCameraFactory,HuarayCameraFactory
UML类图如下:

代码如下:
// 抽象产品类
class CameraDevice
{
public:
CameraDevice() = default;
virtual ~CameraDevice() = 0;
virtual bool Init(){};
virtual bool OpenDevice() = 0;
};
class BaslerCameraDevice : public CameraDevice
{
public:
~BaslerCameraDevice() override;
bool Init() override{};
bool OpenDevice() override{};
};
class HuarayCameraDevice : public CameraDevice
{
public:
~HuarayCameraDevice() override{};
bool Init() override{};
bool OpenDevice() override{};
};
class SickCameraDevice : public CameraDevice
{
public:
~SickCameraDevice() override{};
bool Init() override{};
bool OpenDevice() override{};
};
// 抽象工厂类
class CameraDeviceFactory
{
public:
virtual std::shared_ptr<CameraDevice> CreateCamera() = 0;
};
// 具体工厂类
class BaslerCameraFactory : public CameraDeviceFactory
{
public:
std::shared_ptr<CameraDevice> CreateCamera() override
{
return std::make_shared<BaslerCameraDevice>();
}
};
class HuarayCameraFactory : public CameraDeviceFactory
{
public:
std::shared_ptr<CameraDevice> CreateCamera() override
{
return std::make_shared<HuarayCameraDevice>();
}
};
class SickCameraFactory : public CameraDeviceFactory
{
public:
std::shared_ptr<CameraDevice> CreateCamera() override
{
return std::make_shared<SickCameraDevice>();
}
};
int main()
{
std::shared_ptr<CameraDeviceFactory> factory = std::make_shared<BaslerCameraFactory>();
std::shared_ptr<CameraDevice> camera = factory->CreateCamera();
camera->Init();
camera->OpenDevice();
return 0;
}