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

发布于:2025-03-12 ⋅ 阅读:(10) ⋅ 点赞:(0)

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

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