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

[复制链接]
发表于 2025-10-16 21:08:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

1.模式性子与定位

简单工厂:并非正式的计划模式(属编程风俗),通过单一工厂类根据参数判定创建差异产物,本质是将对象创建逻辑会合管理。
工厂方法:是尺度的创建型计划模式,界说抽象创建接口,由子类决定实例化哪个详细产物类,夸大 “单一产物” 的机动创建。
抽象工厂:同样是创建型计划模式,聚焦 “产物族” 的创建,一个工厂类负责创建一组相干产物(如手机、耳机、充电器构成的电子产物族)。
2产物创建范围

简单工厂、工厂方法:偏重单个产物的创建。比方,创建 “手机” 这一产物,简单工厂通过条件判定决定详细手机范例,工厂方法通过子类工厂创建特定手机。
抽象工厂:关注多个相干产物的组合创建。如创建 “手机 + 耳机” 的产物族,抽象工厂需界说多个创建方法,分别天生差异范例的产物。
3.扩展性与开闭原则

简单工厂:扩展性差。新增产物时需修改工厂类的创建逻辑(如添加if-else或switch分支),违背开闭原则。
工厂方法:扩展性好。新增产物时,只需界说新的产物类和对应的工厂子类,无需修改原有工厂代码,完全符合开闭原则。
抽象工厂:扩展性较复杂。新增产物族时,可通过扩展工厂子类实现;但新增某一产物范例(如产物族中新增 “平板”),需修改抽象工厂接口及全部详细工厂类,违背开闭原则。
      
  • 结构复杂度
    简单工厂:结构最简单,仅一个工厂类处置惩罚全部产物创建逻辑。
    工厂方法:复杂度适中,包罗抽象产物、详细产物、抽象工厂、详细工厂等类,需为每个产物计划对应的工厂子类。
    抽象工厂:结构最复杂,涉及多个产物接口、多个详细产物类,以及包罗多个创建方法的抽象工厂和详细工厂类,代码量和类关系更多。  
  • 范例应用场景
    简单工厂:实用于产物种类少、创建逻辑不复杂,且后续扩展需求低的场景,如简单的日志日志记录器创建。
    工厂方法:实用于须要机动扩展产物范例的场景,如差异数据库毗连对象的创建(新增数据库范例时,扩展工厂子类即可)。
    抽象工厂:实用于产物需成族搭配利用的场景,如跨平台 UI 组件(Windows 和 Mac 的 “按钮 + 文本框” 组件族,通过抽象工厂创建对应平台的组件组合)。
4. 简单工厂模式

      
  • 界说付出接口
  1. public interface Payment {
  2.    
  3.    
  4.     String pay(String orderId, double amount);
  5. }
复制代码
2.实现微信付出类
  1. public class WeChatPayment implements Payment {
  2.    
  3.    
  4.     @Override
  5.     public String pay(String orderId, double amount) {
  6.    
  7.    
  8.         return "使用微信支付,订单号:" + orderId + ",金额:" + amount;
  9.     }
  10. }
复制代码
3.实现付出宝付出类
  1. public class AlipayPayment implements Payment {
  2.    
  3.    
  4.     @Override
  5.     public String pay(String orderId, double amount) {
  6.    
  7.    
  8.         return "使用支付宝支付,订单号:" + orderId + ",金额:" + amount;
  9.     }
  10. }
复制代码
      
  • 创建简单工厂类
  1. public class PaymentFactory {
  2.    
  3.    
  4.     public static Payment createPayment(String payType) {
  5.    
  6.    
  7.         if ("wechat".equals(payType)) {
  8.    
  9.    
  10.             return new WeChatPayment();
  11.         } else if ("alipay".equals(payType)) {
  12.    
  13.    
  14.             return new AlipayPayment();
  15.         }
  16.         return null;
  17.     }
  18. }
复制代码
      
  • 客户端调用
  1. public class Client {
  2.    
  3.    
  4.     public static void main(String
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表