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

简单工厂 、工厂方法模式和抽象工厂模式

简单工厂 、工厂方法模式和抽象工厂模式

1.模式性质与定位

简单工厂:并非正式的设计模式(属编程习惯),通过单一工厂类根据参数判断创建不同产品,本质是将对象创建逻辑集中管理。
工厂方法:是标准的创建型设计模式,定义抽象创建接口,由子类决定实例化哪个具体产品类,强调 “单一产品” 的灵活创建。
抽象工厂:同样是创建型设计模式,聚焦 “产品族” 的创建,一个工厂类负责创建一组相关产品(如手机、耳机、充电器组成的电子产品族)。

2产品创建范围

简单工厂、工厂方法:侧重单个产品的创建。例如,创建 “手机” 这一产品,简单工厂通过条件判断决定具体手机类型,工厂方法通过子类工厂创建特定手机。
抽象工厂:关注多个相关产品的组合创建。如创建 “手机 + 耳机” 的产品族,抽象工厂需定义多个创建方法,分别生成不同类型的产品。

3.扩展性与开闭原则

简单工厂:扩展性差。新增产品时需修改工厂类的创建逻辑(如添加if-else或switch分支),违反开闭原则。
工厂方法:扩展性好。新增产品时,只需定义新的产品类和对应的工厂子类,无需修改原有工厂代码,完全符合开闭原则。
抽象工厂:扩展性较复杂。新增产品族时,可通过扩展工厂子类实现;但新增某一产品类型(如产品族中新增 “平板”),需修改抽象工厂接口及所有具体工厂类,违背开闭原则。

  1. 结构复杂度
    简单工厂:结构最简单,仅一个工厂类处理所有产品创建逻辑。
    工厂方法:复杂度适中,包含抽象产品、具体产品、抽象工厂、具体工厂等类,需为每个产品设计对应的工厂子类。
    抽象工厂:结构最复杂,涉及多个产品接口、多个具体产品类,以及包含多个创建方法的抽象工厂和具体工厂类,代码量和类关系更多。
  2. 典型应用场景
    简单工厂:适用于产品种类少、创建逻辑不复杂,且后续扩展需求低的场景,如简单的日志记录器创建。
    工厂方法:适用于需要灵活扩展产品类型的场景,如不同数据库连接对象的创建(新增数据库类型时,扩展工厂子类即可)。
    抽象工厂:适用于产品需成族搭配使用的场景,如跨平台 UI 组件(Windows 和 Mac 的 “按钮 + 文本框” 组件族,通过抽象工厂创建对应平台的组件组合)。
4. 简单工厂模式
  1. 定义支付接口
public interface Payment {
   
    String pay(String orderId, double amount);
}

2.实现微信支付类

public class WeChatPayment implements Payment {
   
    @Override
    public String pay(String orderId, double amount) {
   
        return "使用微信支付,订单号:" + orderId + ",金额:" + amount;
    }
}

3.实现支付宝支付类

public class AlipayPayment implements Payment {
   
    @Override
    public String pay(String orderId, double amount) {
   
        return "使用支付宝支付,订单号:" + orderId + ",金额:" + amount;
    }
}
  1. 创建简单工厂类
public class PaymentFactory {
   
    public static Payment createPayment(String payType) {
   
        if ("wechat".equals(payType)) {
   
            return new WeChatPayment();
        } else if ("alipay".equals(payType)) {
   
            return new AlipayPayment();
        }
        return null;
    }
}
  1. 客户端调用
public class 

相关文章:

  • 前端笔记 --- vue框架
  • RabbitMQ 从入门到精通
  • ffmpeg打开麦克风,录制音频并重采样
  • Diffusion-Probabilistic-Models环境配置
  • 【leetcode hot 100 148】排序序列
  • FreeRTOS之队列集
  • Vulnhub-sundown
  • 关于MCP SSE 服务器的工作原理
  • 波特率、比特率、传信率、传码率......
  • 17 | 实现简洁架构的 Biz 层
  • 前端轮播图carousel案例(带详细注释)
  • 深入探索 Java Stream
  • 赶紧白P这款免费神器!
  • AGI大模型(3):大模型生成内容
  • 【ES6】在ES6中自定义数组
  • STM32 HAL库实战:高效整合DMA与ADC开发指南
  • 向智能辅助驾驶的道路车道线检测算法研究
  • Franka机器人ROS 2 发布:赋能机器人研究和行业应用
  • 职坐标IT技能提升全攻略
  • 得物,蓝禾,快手,优博讯,三七互娱,途游游戏,顺丰,oppo,游卡,汤臣倍健,康冠科技,作业帮25春招内推
  • 巴基斯坦称对印度发起军事行动
  • 央行:货币与物价的关系受多重因素影响,提振物价的关键在于扩大有效需求
  • 港理大研究揭示:塑胶废物潜藏微生物群落或引发生态危机
  • 陈雯出任外交部离退休干部局局长,此前为外交部办公厅副主任
  • 川大全职引进考古学家宫本一夫,他曾任日本九州大学副校长
  • 纪念|“补白大王”郑逸梅,从藏扇看其眼光品味