工厂模式与抽象工厂模式
·
工厂模式与抽象工厂模式
工厂模式与抽象工厂模式
引用 6 篇资料作为参考
- 工厂模式_百度百科
- 工厂模式
- 抽象工厂和工厂模式的区别c
- 工厂模式和抽象工厂模式的区别
- 设计模式-工厂、抽象工厂模式
- C工厂模式与抽象工厂有何区别 - 问答 - 亿速云
工厂模式与抽象工厂模式对比解析
一、核心定义与设计目标
- 工厂模式
- 定义:通过一个工厂接口或类创建单一类型的对象,隐藏具体实现类的实例化逻辑。
- 目标:解耦对象的创建与使用,简化客户端代码对具体类的依赖。例如,网页1中通过Factory.creator(1)生成SampleA实例,客户端无需直接操作new。
- 实现形式:
- 简单工厂:单一工厂类根据参数返回不同产品(如网页2的Factory类通过条件分支生成SampleA或SampleB)。
- 工厂方法:每个产品对应一个工厂子类(如网页5的CarFactory类)。
- 抽象工厂模式
- 定义:提供一个接口用于创建一组相关或依赖的对象(称为“产品族”),例如同一品牌的不同硬件组件。
- 目标:确保产品族的兼容性和一致性。例如,网页5中的HPFactory同时生成键盘、显示器和鼠标,保证所有组件来自同一品牌。
- 实现形式:通过抽象工厂接口定义多个创建方法(如createKeyboard()、createMonitor()等),具体工厂实现这些方法生成同一系列的产品。
二、关键区别对比
|
维度 |
工厂模式 |
抽象工厂模式 |
|
核心关注点 |
单一产品的创建逻辑 |
多个相关产品的组合与兼容性 |
|
接口设计 |
单个方法(如createProduct()) |
多个方法(如createA()、createB()) |
|
扩展性 |
新增产品需修改工厂类逻辑 |
新增产品族需新增具体工厂类 |
|
代码耦合度 |
客户端依赖产品接口 |
客户端依赖抽象工厂和产品接口 |
示例说明:
- 工厂模式:若需新增SampleC,需在Factory类中增加条件分支。
- 抽象工厂:若需支持新品牌“Lenovo”,只需新增LenovoFactory类,无需修改原有代码。
三、应用场景与典型案例
- 工厂模式适用场景
- 单一产品创建:如动态加载数据库驱动(网页1中的ForumFactory根据配置生成不同数据库操作类)。
- 快速原型开发:需要快速替换实现类时(如测试环境使用Mock对象)。
- 抽象工厂模式适用场景
- 产品族一致性要求高:如操作系统UI组件(Windows风格按钮+文本框)、游戏角色装备套装。
- 跨平台兼容性:同一应用在不同操作系统下需生成适配的窗口、按钮等组件(如网页5的HPFactory和DELLFactory)。
四、扩展性与维护成本
- 工厂模式
- 横向扩展:新增产品需修改工厂类(如网页4中增加Product3需新增Factory3类)。
- 维护成本:产品类型过多时,工厂类条件分支会臃肿(如网页2的if-else逻辑)。
- 抽象工厂模式
- 纵向扩展:新增产品族只需新增具体工厂(如网页5中增加LenovoFactory支持新品牌)。
- 维护挑战:新增产品类型需修改所有工厂类(如网页4中新增ProductC需修改抽象接口和所有子类)。
五、实际代码结构对比
- 工厂模式代码示例
// 简单工厂
public class CarFactory {
public static Car createCar(String type) {
if ("Audi".equals(type)) return new Audi();
else if ("BMW".equals(type)) return new BMW();
throw new IllegalArgumentException("Unsupported type");
}
}
- 抽象工厂代码示例
// 抽象工厂接口(PHP示例)
interface AbstractPCFactory {
public function createKeyboard();
public function createMonitor();
}
class HPFactory implements AbstractPCFactory {
public function createKeyboard() { return new HPKeyboard(); }
public function createMonitor() { return new HPMonitor(); }
}
六、总结与选型建议
- 优先工厂模式:当系统只需创建单一类型对象,且未来扩展可能性较低时(如工具类库)。
- 选择抽象工厂:当需要管理多个相关对象,且需保证兼容性(如跨平台应用、硬件配置系统)。
- 混合使用:复杂系统中可结合两者,例如用抽象工厂管理核心产品族,工厂模式处理辅助对象。
更多推荐



所有评论(0)