当前位置: 首页 > news >正文

23种设计模式 - 抽象工厂模式

模式定义

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,提供接口用于创建一组相关或相互依赖的对象家族,而无需指定具体类[2][3][5]。其核心是通过抽象工厂统一管理多个产品族的创建,确保产品之间的兼容性,适用于需要统一风格或约束的场景(如不同品牌的数控系统组件)。


模式结构

抽象产品族(Abstract Product Family):定义产品家族的接口(如数控系统中的运动控制器、传感器)。
具体产品(Concrete Product):实现同一产品族的不同品牌/类型组件(如西门子运动控制器、发那科传感器)。
抽象工厂(Abstract Factory):声明创建整个产品族的方法(如createMotion()createSensor())。
具体工厂(Concrete Factory):实现抽象工厂接口,生成同一品牌/系列的具体产品[2][3][5]。


C++示例(数控系统场景)

#include 

// 抽象产品1:运动控制器接口
class MotionController {
public:
    virtual void execute() = 0;
    virtual ~MotionController() = default;
};

// 具体产品1A:西门子运动控制器
class SiemensMotion : public MotionController {
public:
    void execute() override {
        std::cout << "西门子系统:执行五轴联动控制" << std::endl;
    }
};

// 具体产品1B:发那科运动控制器
class FanucMotion : public MotionController {
public:
    void execute() override {
        std::cout << "发那科系统:执行高速高精度插补" << std::endl;
    }
};

// 抽象产品2:传感器接口
class Sensor {
public:
    virtual void readData() = 0;
    virtual ~Sensor() = default;
};

// 具体产品2A:西门子传感器
class SiemensSensor : public Sensor {
public:
    void readData() override {
        std::cout << "西门子传感器:采集温度与振动数据" << std::endl;
    }
};

// 具体产品2B:发那科传感器
class FanucSensor : public Sensor {
public:
    void readData() override {
        std::cout << "发那科传感器:检测刀具磨损状态" << std::endl;
    }
};

// 抽象工厂:支持创建同一品牌的产品族
class CNCFactory {
public:
    virtual MotionController* createMotion() = 0;
    virtual Sensor* createSensor() = 0;
    virtual ~CNCFactory() = default;
};

// 具体工厂1:西门子产品族工厂
class SiemensFactory : public CNCFactory {
public:
    MotionController* createMotion() override {
        return new SiemensMotion();
    }
    Sensor* createSensor() override {
        return new SiemensSensor();
    }
};

// 具体工厂2:发那科产品族工厂
class FanucFactory : public CNCFactory {
public:
    MotionController* createMotion() override {
        return new FanucMotion();
    }
    Sensor* createSensor() override {
        return new FanucSensor();
    }
};

// 客户端代码
int main() {
    // 使用西门子工厂创建产品族
    CNCFactory* siemensFactory = new SiemensFactory();
    MotionController* siemensMotion = siemensFactory->createMotion();
    Sensor* siemensSensor = siemensFactory->createSensor();
    siemensMotion->execute();  // 输出西门子系统控制逻辑
    siemensSensor->readData(); // 输出西门子传感器逻辑

    // 使用发那科工厂创建产品族
    CNCFactory* fanucFactory = new FanucFactory();
    MotionController* fanucMotion = fanucFactory->createMotion();
    Sensor* fanucSensor = fanucFactory->createSensor();
    fanucMotion->execute();    // 输出发那科系统控制逻辑
    fanucSensor->readData();   // 输出发那科传感器逻辑

    // 释放资源
    delete siemensFactory;
    delete siemensMotion;
    delete siemensSensor;
    delete fanucFactory;
    delete fanucMotion;
    delete fanucSensor;
    return 0;
}

模式优势

产品族一致性:确保同一工厂创建的对象相互兼容(如西门子控制器与传感器协同工作)。
解耦与扩展性:新增品牌或产品族时(如海德汉系统),只需扩展工厂和产品类,无需修改客户端代码。
统一接口:客户端仅依赖抽象接口,屏蔽具体实现细节。


适用场景

需要创建多个关联产品的系统(如数控系统的控制器、传感器、驱动器)。
需要约束产品间的兼容性(如不允许混用不同品牌的组件)。

相关文章:

  • 23种设计模式 - 工厂方法模式
  • 智能选路+NAT实验
  • Linux驱动学习(二)--字符设备
  • 力扣-二叉树-700 二叉搜索树中的搜索
  • Springboot接口返回的时间和数据库差了八小时
  • ctfshow web入门 web11-web24
  • Android GreenDAO 适配 AGP 8.0+
  • 使用 Redis 实现 RBAC 权限管理
  • Python毕业设计选题:基于python的酒店推荐系统_django+hadoop
  • 腾讯云ChatBI通过中国信通院大模型驱动的智能数据分析工具专项测试
  • Myplater项目
  • @RestController和@RequestBody注解含义
  • 出现 [ app.json 文件内容错误] app.json: 在项目根目录未找到 app.json (env: Windows,mp 解决方法
  • VSCode本地python包“无法解析导入”
  • 千峰React:脚手架准备+JSX基础
  • Python 文件操作利器:FileUtils 工具类深度剖析
  • 赛前启航 | Azure 应用开发实战指南:开启创意的无限可能
  • MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 基础篇 part 15
  • 工业安全的智能哨兵:AI如何筑起生产线的“数字防火墙“
  • React实现自定义图表(线状+柱状)
  • 我国外汇储备规模连续17个月稳定在3.2万亿美元以上
  • 这个五月,有三部纪录电影值得一看
  • 巴基斯坦军方:印度向巴本土及巴控克什米尔发射导弹
  • 人民日报评论:莫让“胖东来们”陷入“棒杀”“捧杀”泥潭
  • 《中国医药指南》就“宫颈癌等论文出现男性病例”致歉:辞退涉事编辑
  • 日本儿童人数已连续44年减少,少子化问题越发严重