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

ops/2025/3/13 20:27:36/

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

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 {@Overridepublic String pay(String orderId, double amount) {return "使用微信支付,订单号:" + orderId + ",金额:" + amount;}
}

3.实现支付宝支付类

public class AlipayPayment implements Payment {@Overridepublic 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 

http://www.ppmy.cn/ops/165505.html

相关文章

多线程--参数传递之间的关系

在C中创建线程时,传递参数的方式会影响参数的生命周期、线程的安全性和性能。以下是几种常见的传递方式及其适用情况: 1. 值传递 值传递会创建参数的副本,并在线程函数内部使用该副本。这种方式可以避免线程之间的竞态条件,因为…

hive 中可能产生小文件的场景

在 Hive 中,小文件是指文件大小远小于 HDFS 块大小(通常为 128 MB 或 256 MB)的文件。小文件过多会导致 NameNode 内存压力增大、查询性能下降以及资源浪费。以下是 Hive 中可能产生小文件的常见场景: 1. 高频插入数据 场景描述 …

推理大模型时代,TextIn ParseX助力出版业知识资产重构

在大语言模型(LLM)与推理能力快速进化的技术浪潮下,出版机构沉淀数十年的非结构化数据资产,包括书籍、期刊、手稿及历史档案,正在焕发新的机遇。基于文档解析、NLP与大模型的推理生成能力,我们在图书馆层层…

MyBatis - XML 操作动态 SQL

目录 1. 前言 2. 动态插入 2.1 if 标签 2.2 trim 标签 2.2.1 注解完成动态 SQL 3. 动态查询 3.1 添加 1 1 3.2 where 标签 4. 动态更新 4.1 set 标签 5. foreach 标签 6. sql 标签 & include 标签 1. 前言 之前博文所讲的 MyBatis SQL 操作, 都必须按照注解或…

LVS + Keepalived 高可用集群

一、LVSKeepalived 原理 1.1.LVS 负载均衡原理 LVS(Linux Virtual Server)是一种基于 Linux 内核的负载均衡技术,它通过 IPVS(IP Virtual Server)模块来实现。LVS 可以将客户端的请求分发到多个后端服务器上&#xf…

zerotier搭建免费moon服务器

🌟 前言 ZeroTier是一种基于P2P的虚拟组网工具,通过搭建‌Moon服务器‌可大幅提升跨运营商/跨国节点的连接质量。本文使用云服务演示部署流程。 📋 准备工作 ‌注册三丰云账号‌ ‌创建CentOS 8.5实例‌ (这里选择centos8以上&a…

[GHCTF 2025]GetShell

题目 <?php highlight_file(__FILE__);class ConfigLoader {private $config;public function __construct() {$this->config [debug > true,mode > production,log_level > info,max_input_length > 100,min_password_length > 8,allowed_actions &g…

Jupyter Notebook 全平台安装与配置教程(附Python/Anaconda双方案)

一、软件定位与特性 Jupyter Notebook 是交互式编程与数据科学分析工具&#xff0c;支持 40 编程语言&#xff0c;其基于浏览器的「代码块可视化」工作流&#xff0c;已成为机器学习、数据清洗、学术研究的标准环境。核心优势包括&#xff1a; 实时执行代码片段并保存结果支持…