自适应网站怎样做移动适配,网站设计制作视频,李字logo创意设计,广东营销网站建设服务设计模式学习#xff08;二#xff09;工厂模式——工厂方法模式 前言工厂方法模式简介示例优点缺点使用场景 前言
前一篇文章介绍了简单工厂模式#xff0c;提到了简单工厂模式的缺点#xff08;违反开闭原则#xff0c;扩展困难#xff09;#xff0c;本文要介绍的工… 设计模式学习二工厂模式——工厂方法模式 前言工厂方法模式简介示例优点缺点使用场景 前言
前一篇文章介绍了简单工厂模式提到了简单工厂模式的缺点违反开闭原则扩展困难本文要介绍的工厂方法模式在一定程度上弥补了简单工厂模式的缺点。
工厂方法模式
简介
工厂方法模式是创建型设计模式之一它在抽象工厂类中声明创建对象的接口在具体工厂类中实现具体的实例化过程。这个模式的核心思想是将对象的实例化延迟到子类中进行从而使得父类通过其子类来指定创建哪个对象实现了类的实例化操作的封装和数据的封装。
这样的话当要添加一个具体产品时我们不会修改原有的工厂类不违反开闭原则而是新创建一个关联于具体产品的具体工厂类易扩展。
示例
抽象相机类CameraDevice 具体相机类BaslerCameraDeviceSickCameraDeviceHuarayCameraDevice
抽象工厂类CameraDeviceFactory 具体工厂类BaslerCameraFactorySickCameraFactoryHuarayCameraFactory
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_ptrCameraDevice CreateCamera() 0;
};// 具体工厂类
class BaslerCameraFactory : public CameraDeviceFactory
{
public:std::shared_ptrCameraDevice CreateCamera() override {return std::make_sharedBaslerCameraDevice();}
};class HuarayCameraFactory : public CameraDeviceFactory
{
public:std::shared_ptrCameraDevice CreateCamera() override {return std::make_sharedHuarayCameraDevice();}
};class SickCameraFactory : public CameraDeviceFactory
{
public:std::shared_ptrCameraDevice CreateCamera() override {return std::make_sharedSickCameraDevice();}
};int main()
{std::shared_ptrCameraDeviceFactory factory std::make_sharedBaslerCameraFactory();std::shared_ptrCameraDevice camera factory-CreateCamera();camera-Init();camera-OpenDevice();return 0;
}优点
解耦工厂方法模式可以减少客户代码与具体类之间的耦合。客户端在使用的时候只需知道接口而不是具体类。这样可以更容易地扩展或修改创建逻辑而无需修改现有客户代码。符合开闭原则工厂方法模式允许系统在不修改现有代码的情况下引入新的类型。满足对扩展开放对修改封闭的原则。单一职责原则工厂方法模式中创建对象的逻辑被封装在一个工厂类中这符合单一职责原则。这让代码更加清晰维护也更简单。
缺点
代码复杂工厂方法模式为每种产品类型提供一个单独的工厂类。这意味着每增加一个新的产品类别就需要增加一个新的具体工厂类。这会导致类的数量迅速增加从而增加了代码的复杂性代码冗余如果具体工厂类之间的创建逻辑相似这可能会导致代码冗余。虽然每个工厂类只负责创建一个具体产品但这些工厂类的创建逻辑可能高度相似不能有效地重用代码。
使用场景
产品类别经常变化一个系统会频繁添加或修改产品的创建而每种产品的创建又有不同的复杂配置和依赖时工厂方法可以将具体产品的创建逻辑封装在各自的工厂类中从而简化客户端代码。