资讯详情

资讯详情

工厂方法模式(Factory Method Pattern)详解:将对象创建委托给子类的创建型设计模式

教程知识库【免费下载链接】tech-interview-for-developer 신입 개발자 전공 지식 기술 면접 백과사전 项目地址https://gitcode.com/GitHub_Trending/te/tech-interview-for-developer点击查看免费下载工厂方法模式Factory Method Pattern是 GoF 创建型设计模式中的经典模式之一其核心思想是把创建对象的部分委托给子类完成父类只定义工厂方法的抽象契约由每个子类工厂根据传入的参数决定具体实例化哪一个产品对象。本文以tech-interview-for-developer仓库中 Design Pattern_Factory Method.md 的 Robot 工厂示例为主线结合仓库内 设计模式概述、SOLID 原则、模板方法模式 等配套文档从类结构、Java 代码实现、模式对比到面试考点层层展开。读完本文你将能够独立写出可运行的工厂方法模式示例并说清它与其他创建型模式、与开闭原则OCP之间的关系。一、一句话理解工厂方法模式原文用一句话高度概括了这个模式的本质객체를 만드는 부분을 Sub class에 맡기는 패턴—— 把创建对象这件事交给子类Sub class去做的模式。也就是说客户端Client不再直接new一个具体的产品类而是通过某个工厂对象来获取产品工厂对象负责判断这次该创建哪个具体产品。工厂本身不一定是具体类而往往是一个抽象类或接口真正决定造什么的逻辑由它的各个子类各自实现。这与仓库中 设计模式概述 对创建型模式Creational Pattern的定义完全吻合创建型模式决定对象的创建方式类创建型模式Class-creational patterns与对象创建型模式Object-creational patterns共同解决如何解耦对象的创建与使用这一核心问题。二、模式类结构Robot 与 RobotFactory 的双层抽象原文档给出了一个非常直观的类层次结构这里完整保留并加以注释Robot (抽象类 / Abstract Class) —— 产品Product ㄴ SuperRobot —— 具体产品 1 ㄴ PowerRobot —— 具体产品 2 RobotFactory (抽象类 / Abstract Factory) —— 工厂Creator ㄴ SuperRobotFactory —— 具体工厂 1 ㄴ ModifiedSuperRobotFactory —— 具体工厂 2可自行扩展的变体即Robot 这个产品类是由 RobotFactory 这个工厂类来生成的。这里出现了两个层次的抽象产品层ProductRobot作为抽象基类定义所有机器人的公共行为SuperRobot、PowerRobot是它的两个具体实现代表不同类型的机器人。工厂层CreatorRobotFactory作为抽象工厂声明统一的创建方法createRobot()SuperRobotFactory、ModifiedSuperRobotFactory各自实现这个方法决定根据什么条件创建哪个 Robot。正是这种产品抽象 工厂抽象的双层结构让客户端只依赖RobotFactory与Robot这两个抽象而完全不知道SuperRobot、PowerRobot的存在——这就是典型的面向接口编程。三、Java 代码实现从抽象工厂到具体工厂1. 抽象工厂 RobotFactory原文档核心代码public abstract class RobotFactory { abstract Robot createRobot(String name); }要点解读RobotFactory是抽象类无法被直接实例化createRobot(String name)是抽象方法没有方法体只有方法签名因为方法被声明为abstract所有继承RobotFactory的子类都必须在自己的类体中实现createRobot()——这是 Java 语法层面的强制约束也是必须声明 createRobot的由来。2. 具体工厂 SuperRobotFactory原文档核心代码public class SuperRobotFactory extends RobotFactory { Override Robot createRobot(String name) { switch(name) { case super : return new SuperRobot(); case power : return new PowerRobot(); } return null; } }要点解读SuperRobotFactory继承RobotFactory并重写OverridecreateRobot通过switch对传入的name参数进行分支判断传入super→ 返回new SuperRobot()传入power→ 返回new PowerRobot()都不匹配 → 返回null示意性的兜底处理这样设计的直接结果是根据name传入值的不同工厂创建出的 Robot 类型也不同——同一工厂方法按参数产出不同产品这正是工厂方法模式参数化创建的核心行为。原文档特别强调了两点本文予以保留并展开生成对象的类被单独分离出来创建逻辑不再散落在客户端代码中而是收敛到SuperRobotFactory这一个类里客户端只需要调用createRobot(super)就能拿到目标对象无需关心内部构造细节因为继承了工厂抽象类子类必须声明 createRobot抽象方法约束保证了所有工厂子类对外提供一致的方法签名这是模式可用性的语法保障。3. 补全可运行示例产品类与客户端原文档只给出了工厂侧的两个类为了让示例真正可复制、可运行这里按同样的类结构补全产品类与入口类产品类的具体成员方法在原文档中未给出以下为基于类结构的示意实现// Robot.java —— 抽象产品 public abstract class Robot { public abstract void introduce(); } // SuperRobot.java —— 具体产品 1 public class SuperRobot extends Robot { Override public void introduce() { System.out.println(I am SuperRobot.); } } // PowerRobot.java —— 具体产品 2 public class PowerRobot extends Robot { Override public void introduce() { System.out.println(I am PowerRobot.); } } // Main.java —— 客户端只依赖抽象 Robot 与抽象 RobotFactory public class Main { public static void main(String[] args) { RobotFactory factory new SuperRobotFactory(); Robot superRobot factory.createRobot(super); Robot powerRobot factory.createRobot(power); superRobot.introduce(); // I am SuperRobot. powerRobot.introduce(); // I am PowerRobot. } }注意观察客户端代码Main只与RobotFactory抽象工厂和Robot抽象产品打交道代码中自始至终没有出现SuperRobot、PowerRobot的直接new。新增一种机器人时客户端代码无需改动。四、ModifiedSuperRobotFactory验证开闭原则的扩展写法原文档的类结构中还列出了ModifiedSuperRobotFactory这个变体工厂。虽然其具体实现未在原文给出但从命名与工厂方法模式的惯常做法可以推断它提供了一种修改过的创建策略——例如使用if-else替代switch、或扩展支持更多的机器人类型。这里给出一种基于if-else的等价实现便于对比两种分支写法的差异public class ModifiedSuperRobotFactory extends RobotFactory { Override Robot createRobot(String name) { if (name.equals(super)) { return new SuperRobot(); } else if (name.equals(power)) { return new PowerRobot(); } return null; } }两个工厂并存的意义客户端只需把new SuperRobotFactory()换成new ModifiedSuperRobotFactory()即可在不改动调用方式createRobot(super)的前提下切换整套创建逻辑。这正是开闭原则OCP在模式层面的体现——仓库中 SOLID.md 对 OCP 的定义是软件实体应对扩展开放、对修改关闭新增工厂子类属于扩展不改动已有类属于对修改关闭。五、工厂方法模式在 Java 生态中的真实应用java.util.Calendar/java.text.NumberFormatNumberFormat.getInstance()、Calendar.getInstance()等静态工厂方法会根据运行环境的Locale、时区等参数返回不同具体子类的实例——调用方拿到的都是抽象类型具体实现由 JDK 内部决定Spring 框架的BeanFactory/ApplicationContext容器根据 Bean 定义名称、类型、配置创建并返回对象是工厂思想在 IoC 容器中的规模化应用Java 9 的集合工厂方法List.of(...)、Map.of(...)通过工厂方法返回不可变集合实例。以上为业界公认的应用场景用于帮助理解模式价值具体到本仓库tech-interview-for-developer是面试知识整理型仓库见 README.md本身不包含工厂方法模式的工程实现代码工厂方法模式的代表性代码即本文所引用的 Design Pattern_Factory Method.md。六、与其他设计模式的对比面试高频1. 与模板方法模式Template Method Pattern的关系两者都使用抽象类 子类实现的结构但关注点不同模板方法模式父类用普通方法写好不可变的主干算法流程把其中变化的步骤声明为abstract交由子类填充。仓库中的 Design Pattern_Template Method.md 用HouseTemplate.buildHouse()的固定流程打地基→立柱子→砌墙→装窗配合buildWalls()、buildPillars()两个抽象方法做了清晰示范工厂方法模式父类只声明一个抽象的创建方法子类各自实现按参数产不同产品的逻辑。两者差异可总结为模板方法骨架固定、步骤可换工厂方法创建入口固定、产品可换。2. 与简单工厂Simple Factory的区别简单工厂通常是一个具体类内含静态方法用switch/if-else直接判断返回哪种产品类本身不可被继承扩展工厂方法模式把判断逻辑下沉到可继承的抽象工厂子类中通过每个子类工厂管一类产品实现扩展是简单工厂的面向对象改良版。原文档中的SuperRobotFactory若去掉RobotFactory抽象父类、将createRobot改为静态方法就退化为简单工厂。3. 与策略模式Strategy Pattern、适配器模式Adapter Pattern的区分策略模式关注算法的封装与可替换把行为如导弹发射方式封装为独立类运行时切换。见仓库 Strategy Pattern.md 中战斗机/直升机的射击逻辑示例适配器模式关注接口的兼容转换用一个适配类包住不兼容的类让旧接口可以驱动新实现。见仓库 Design Pattern_Adapter.md 中FormatAdapter让 MP4 通过MediaPlayer接口播放的示例工厂方法模式关注对象的创建位置与时机不解决算法、不解决接口兼容只解决谁来 new、怎么 new。七、模式价值优点与缺点优点解耦创建与使用客户端面向Robot/RobotFactory抽象编程不依赖任何具体产品类符合开闭原则OCP新增产品类型时只需新增产品子类和对应的工厂子类无需修改已有代码符合单一职责原则SRP创建逻辑被集中到工厂类中客户端类与产品类的职责更纯粹参见仓库 SOLID.md 对 SRP一个类只应有一个变更理由的阐述代码复用与维护友好所有产品的创建入口统一为createRobot(name)调用方式一致。缺点类数量膨胀每新增一类产品通常就要新增一个产品类和或一个工厂类系统类数量随之增加管理成本上升增加抽象与理解成本相比直接new多了一层工厂间接层初学者容易觉得绕扩展需要同时维护产品层与工厂层如果工厂子类数量过多仍需小心维护分支逻辑避免switch/if-else过度膨胀。八、总结与面试速答原文档最终的归纳非常精炼这里完整保留并翻译把要创建的对象单独放置工厂根据传入工厂的值不同创建出不同的产品机器人 / 披萨。面试高频三连问与标准答法Q工厂方法模式是什么A创建型模式把对象的创建委托给抽象工厂的子类子类根据传入参数决定实例化哪个具体产品。Q它和简单工厂有什么区别A简单工厂是单个具体类的静态分支判断不可扩展工厂方法模式通过抽象工厂 多个子类工厂实现扩展符合开闭原则。Q它解决了什么问题A解耦客户端与具体产品类的直接依赖让新增产品变为新增类而非改代码。如需进一步学习相关知识点可继续阅读仓库中的 设计模式概述创建型/结构型/行为型分类、SOLID.md模式背后的设计原则、Design Pattern_Template Method.md同为抽象类子类结构的姊妹模式等文档。赞分享教程知识库【免费下载链接】tech-interview-for-developer 신입 개발자 전공 지식 기술 면접 백과사전 项目地址https://gitcode.com/GitHub_Trending/te/tech-interview-for-developer点击查看免费下载相关推荐CS-Notes 设计模式解析工厂方法Factory Method——由子类决定实例化哪个类的对象创建模式CS Notes 设计模式解析工厂方法Factory Method——由子类决定实例化哪个类的对象创建模式 工厂方法Factory Method是 C知识库文档教程深入 Go Patterns 工厂方法模式Factory Method用工厂函数解耦对象创建与类型选择深入 Go Patterns 工厂方法模式Factory Method用工厂函数解耦对象创建与类型选择 导读 工厂方法Factory Method是示例工程教程文档golang-design-pattern中的创建型模式对象创建的设计策略golang design pattern中的创建型模式对象创建的设计策略 在软件开发中对象的创建是最基础也最关键的环节之一。错误的对象创建方式可能导致代码示例工程上一篇BMAD-METHOD 快速入门安装、规划深度选择与从需求到代码的四阶段工作流实战下一篇GitHub下载太慢Fast-GitHub加速插件3分钟搞定克隆与下载提速创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →