跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Java工厂模式
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:Java工厂模式}} '''工厂模式'''(Factory Pattern)是[[Java设计模式]]中最常用的创建型模式之一,其主要目的是通过一个共同的接口来创建对象,而无需指定具体的实现类。这种模式将对象的实例化过程封装在工厂类中,提高了代码的灵活性和可维护性。 == 概述 == 工厂模式的核心思想是'''将对象的创建与使用分离'''。客户端无需关心对象的具体创建逻辑,只需通过工厂类获取所需对象。根据抽象程度的不同,工厂模式可分为以下三种类型: # '''简单工厂模式'''(Simple Factory) # '''工厂方法模式'''(Factory Method) # '''抽象工厂模式'''(Abstract Factory) === 适用场景 === * 需要动态创建不同类的实例时 * 系统需要解耦对象的创建与使用 * 需要统一管理对象的生命周期 == 简单工厂模式 == 简单工厂模式通过一个工厂类根据输入参数决定创建哪种产品类的实例。 === 代码示例 === 以下是一个简单的形状工厂示例: <syntaxhighlight lang="java"> // 产品接口 interface Shape { void draw(); } // 具体产品类 class Circle implements Shape { @Override public void draw() { System.out.println("绘制圆形"); } } class Rectangle implements Shape { @Override public void draw() { System.out.println("绘制矩形"); } } // 简单工厂类 class ShapeFactory { public Shape createShape(String type) { if ("circle".equalsIgnoreCase(type)) { return new Circle(); } else if ("rectangle".equalsIgnoreCase(type)) { return new Rectangle(); } throw new IllegalArgumentException("未知形状类型"); } } // 客户端代码 public class Client { public static void main(String[] args) { ShapeFactory factory = new ShapeFactory(); Shape circle = factory.createShape("circle"); circle.draw(); // 输出: 绘制圆形 } } </syntaxhighlight> === 优缺点 === * '''优点''':客户端与具体类解耦 * '''缺点''':违反开闭原则(新增类型需修改工厂类) == 工厂方法模式 == 工厂方法模式通过让子类决定实例化哪个类来扩展简单工厂模式。 === 类图 === <mermaid> classDiagram class Shape { <<interface>> +draw() } class Circle { +draw() } class Rectangle { +draw() } class ShapeFactory { <<interface>> +createShape() } class CircleFactory { +createShape() } class RectangleFactory { +createShape() } Shape <|-- Circle Shape <|-- Rectangle ShapeFactory <|-- CircleFactory ShapeFactory <|-- RectangleFactory CircleFactory --> Circle RectangleFactory --> Rectangle </mermaid> === 代码示例 === <syntaxhighlight lang="java"> // 抽象工厂接口 interface ShapeFactory { Shape createShape(); } // 具体工厂类 class CircleFactory implements ShapeFactory { @Override public Shape createShape() { return new Circle(); } } class RectangleFactory implements ShapeFactory { @Override public Shape createShape() { return new Rectangle(); } } // 客户端代码 public class Client { public static void main(String[] args) { ShapeFactory factory = new CircleFactory(); Shape shape = factory.createShape(); shape.draw(); // 输出: 绘制圆形 } } </syntaxhighlight> == 抽象工厂模式 == 抽象工厂模式提供一个创建一系列相关或依赖对象的接口,而无需指定具体类。 === 实际案例 === 假设需要创建跨平台的UI组件: <syntaxhighlight lang="java"> // 抽象产品接口 interface Button { void render(); } interface Checkbox { void toggle(); } // Windows系列产品 class WinButton implements Button { public void render() { System.out.println("Windows按钮渲染"); } } class WinCheckbox implements Checkbox { public void toggle() { System.out.println("Windows复选框切换"); } } // Mac系列产品 class MacButton implements Button { public void render() { System.out.println("Mac按钮渲染"); } } class MacCheckbox implements Checkbox { public void toggle() { System.out.println("Mac复选框切换"); } } // 抽象工厂 interface GUIFactory { Button createButton(); Checkbox createCheckbox(); } // 具体工厂 class WinFactory implements GUIFactory { public Button createButton() { return new WinButton(); } public Checkbox createCheckbox() { return new WinCheckbox(); } } class MacFactory implements GUIFactory { public Button createButton() { return new MacButton(); } public Checkbox createCheckbox() { return new MacCheckbox(); } } </syntaxhighlight> == 数学原理(可选) == 工厂模式可以形式化为: <math> \text{Factory} : T \rightarrow \text{Product} </math> 其中<math>T</math>是输入参数类型,<math>\text{Product}</math>是产品接口。 == 总结 == {| class="wikitable" |+ 工厂模式对比 ! 模式类型 !! 特点 !! 适用场景 |- | 简单工厂 || 集中式创建 || 对象种类较少 |- | 工厂方法 || 单一职责原则 || 需要扩展产品族 |- | 抽象工厂 || 创建产品簇 || 跨平台/多系列 |} 工厂模式通过'''封装变化'''来提高系统灵活性,是面向对象设计中[[开闭原则]]的典型实践。 [[Category:编程语言]] [[Category:Java]] [[Category:Java设计模式]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)