简单工厂 、工厂方法模式和抽象工厂模式
1.模式性质与定位
简单工厂:并非正式的设计模式(属编程习惯),通过单一工厂类根据参数判断创建不同产品,本质是将对象创建逻辑集中管理。
工厂方法:是标准的创建型设计模式,定义抽象创建接口,由子类决定实例化哪个具体产品类,强调 “单一产品” 的灵活创建。
抽象工厂:同样是创建型设计模式,聚焦 “产品族” 的创建,一个工厂类负责创建一组相关产品(如手机、耳机、充电器组成的电子产品族)。
2产品创建范围
简单工厂、工厂方法:侧重单个产品的创建。例如,创建 “手机” 这一产品,简单工厂通过条件判断决定具体手机类型,工厂方法通过子类工厂创建特定手机。
抽象工厂:关注多个相关产品的组合创建。如创建 “手机 + 耳机” 的产品族,抽象工厂需定义多个创建方法,分别生成不同类型的产品。
3.扩展性与开闭原则
简单工厂:扩展性差。新增产品时需修改工厂类的创建逻辑(如添加if-else或switch分支),违反开闭原则。
工厂方法:扩展性好。新增产品时,只需定义新的产品类和对应的工厂子类,无需修改原有工厂代码,完全符合开闭原则。
抽象工厂:扩展性较复杂。新增产品族时,可通过扩展工厂子类实现;但新增某一产品类型(如产品族中新增 “平板”),需修改抽象工厂接口及所有具体工厂类,违背开闭原则。
- 结构复杂度
简单工厂:结构最简单,仅一个工厂类处理所有产品创建逻辑。
工厂方法:复杂度适中,包含抽象产品、具体产品、抽象工厂、具体工厂等类,需为每个产品设计对应的工厂子类。
抽象工厂:结构最复杂,涉及多个产品接口、多个具体产品类,以及包含多个创建方法的抽象工厂和具体工厂类,代码量和类关系更多。 - 典型应用场景
简单工厂:适用于产品种类少、创建逻辑不复杂,且后续扩展需求低的场景,如简单的日志记录器创建。
工厂方法:适用于需要灵活扩展产品类型的场景,如不同数据库连接对象的创建(新增数据库类型时,扩展工厂子类即可)。
抽象工厂:适用于产品需成族搭配使用的场景,如跨平台 UI 组件(Windows 和 Mac 的 “按钮 + 文本框” 组件族,通过抽象工厂创建对应平台的组件组合)。
4. 简单工厂模式
- 定义支付接口
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;
}
}
- 创建简单工厂类
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;
}
}
- 客户端调用
public class