23种设计模式 - 工厂方法模式

server/2025/2/25 7:14:01/

模式定义

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,定义用于创建对象的接口,让子类决定实例化哪个类,从而将对象创建过程延迟到子类。其核心目的是解耦对象的创建与使用,增强系统的扩展性,符合开闭原则。


模式结构

抽象产品(Product):定义对象的接口(如数控系统中的运动控制器)。
具体产品(Concrete Product):实现抽象产品的具体类(如直线运动、圆弧运动控制器)。
抽象工厂(Creator):声明工厂方法,返回抽象产品类型。
具体工厂(Concrete Creator):重写工厂方法,返回具体产品实例。


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

#include // 抽象产品:运动控制器接口
class MotionController {
public:virtual void execute() = 0;virtual ~MotionController() = default;
};// 具体产品1:直线运动控制器
class LinearMotion : public MotionController {
public:void execute() override {std::cout << "执行直线插补运动" << std::endl;}
};// 具体产品2:圆弧运动控制器
class ArcMotion : public MotionController {
public:void execute() override {std::cout << "执行圆弧插补运动" << std::endl;}
};// 抽象工厂
class MotionFactory {
public:virtual MotionController* createMotion() = 0;virtual ~MotionFactory() = default;
};// 具体工厂1:创建直线运动控制器
class LinearMotionFactory : public MotionFactory {
public:MotionController* createMotion() override {return new LinearMotion();}
};// 具体工厂2:创建圆弧运动控制器
class ArcMotionFactory : public MotionFactory {
public:MotionController* createMotion() override {return new ArcMotion();}
};// 客户端代码
int main() {// 使用直线运动工厂MotionFactory* linearFactory = new LinearMotionFactory();MotionController* linear = linearFactory->createMotion();linear->execute();  // 输出:执行直线插补运动// 使用圆弧运动工厂MotionFactory* arcFactory = new ArcMotionFactory();MotionController* arc = arcFactory->createMotion();arc->execute();     // 输出:执行圆弧插补运动delete linearFactory;delete linear;delete arcFactory;delete arc;return 0;
}

模式优势

解耦性:客户端仅依赖抽象接口,无需关心具体实现类。
扩展性:新增运动类型时(如螺旋运动),只需添加对应的具体产品和工厂类,无需修改已有代码,符合开闭原则。
职责清晰:将对象创建逻辑集中到工厂类,避免代码重复。


适用场景

系统需要支持多种类型的对象创建(如数控系统的不同运动模式)。
创建过程需要动态扩展(如未来新增五轴联动控制)。


对比简单工厂模式

工厂方法模式通过多态性将对象创建延迟到子类,避免了简单工厂模式中因新增类型需修改工厂类的缺点。



http://www.ppmy.cn/server/170504.html

相关文章

基金基础知识

一、基金的本质与价值 定义&#xff1a; 基金是通过集合投资者资金&#xff0c;由专业管理人&#xff08;基金经理&#xff09;进行多元化投资&#xff08;如股票、债券等&#xff09;的金融工具&#xff0c;收益按持有份额分配。 核心优势&#xff1a; 分散风险&#xff1a;…

Hot100 动态规划

动态规划 动规五部曲&#xff1a; 确定dp数组以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 70. 爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 爬到第一层楼梯有一种方法&#xff0c;爬到二层楼梯有两种方法。 那么第一层楼梯再跨两步就到第三…

Linux系统安装MySQL5.7(其他版本类似)避坑指南

1.远程连接 在Linux系统安装好MySQL5.7数据库&#xff0c;不要以为就大功告成了后面还有大坑等着你踩了。宏哥这里介绍一下远程连接遇到的坑以及如何处理。由于征文要求安装环境教学除外宏哥这里就不介绍在Linux系统安装mysql数据库&#xff0c;有需要的可以自己百度一下。但是…

15-贪心算法

一&#xff0c;定义 贪心算法的核心思想 贪心算法的特点是&#xff1a; 局部最优&#xff1a;在每一步选择中&#xff0c;都选择当前看起来最好的选项。 不可回退&#xff1a;一旦做出选择&#xff0c;就不再回头重新考虑。 希望全局最优&#xff1a;通过一系列局部最优的选…

Chrome 浏览器(版本号49之后)‌解决跨域问题

谷歌浏览器解决跨域问题 如何查看 Chrome 浏览器版本号 打开 Chrome 浏览器点击右上角的三个点&#xff0c;打开“设置”页面 点击“关于Chrome” 查看版本号 解决跨域操作&#xff1a;windows系统为例 方法一&#xff1a;命令行启动方式&#xff08;最简单&#xff09; …

Java Set实现类面试题

Java Set实现类面试题 HashSet Q1: HashSet的实现原理是什么&#xff1f; HashSet是基于HashMap实现的&#xff0c;使用HashMap的key来存储元素&#xff0c;value统一使用一个Object对象。 public class HashSetPrincipleExample {// 模拟HashSet的基本实现public class Si…

FutureTask 和 CompletableFuture

FutureTask 和 CompletableFuture 是 Java 并发编程中用于处理异步任务的两种工具&#xff0c;但它们在功能和使用场景上有显著区别。以下是两者的主要对比&#xff1a; 1. FutureTask 定义&#xff1a;FutureTask 是 Future 接口的一个实现类&#xff0c;表示一个异步计算任务…

深入剖析:基于红黑树实现自定义 map 和 set 容器

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; 在 C 标准模板库&#xff08;STL&#xff09;的大家庭里&#xff0c;map和set可是超级重要的关联容器成员呢&#x1f60e;&#x…