在面向对象编程(OOP)的世界中,简单工厂模式(Simple Factory Pattern) 是一种非常常见且实用的设计模式。虽然它并不属于GoF(Gang of Four)定义的23种经典设计模式之一,但它是理解更复杂模式(如工厂方法模式)的重要铺垫。本文将深入解析简单工厂模式的工作原理、实现方式及其在实际项目中的作用。


一、什么是简单工厂模式?

简单工厂模式是一种创建型设计模式,它的核心思想是:根据输入的参数或条件,返回一个特定类的实例。这些类通常继承自同一个基类或接口,具有相同的方法签名,但方法的具体实现可能不同。

简单工厂模式通过一个“工厂”类来封装对象的创建逻辑,使得客户端无需关心具体的对象创建过程,只需要调用工厂提供的接口即可获取所需对象。


二、简单工厂模式的结构解析

我们通过一个类图来理解简单工厂模式的核心组成部分:

  • 基类(Base Class):定义了所有子类共有的接口。
  • 具体类(Concrete Classes):继承自基类,实现具体的业务逻辑。
  • 工厂类(Factory Class):根据传入的参数决定返回哪一个具体类的实例。

以一个名字解析器为例,假设我们有如下类结构:

  • Namer:基类,提供基础属性和方法。
  • FirstFirst:表示“firstname lastname”格式。
  • LastFirst:表示“lastname, firstname”格式。
  • NamerFactory:简单工厂类,根据输入判断使用哪个具体类解析名字。

三、一个C#示例:名字解析器

1. 定义基类 Namer

public class Namer
{protected string frName, lName;public string GetFrname(){return frName;}public string GetLname(){return lName;}
}

该类定义了两个受保护的字段 frNamelName,并提供公共方法来获取它们。


2. 实现具体类 FirstFirstLastFirst

FirstFirst 类处理“firstname lastname”格式:

public class FirstFirst : Namer
{public FirstFirst(string name){int i = name.Trim().IndexOf(" ");if (i > 0){frName = name.Substring(0, i).Trim();lName = name.Substring(i + 1).Trim();}else{lName = name;frName = "";}}
}

LastFirst 类处理“lastname, firstname”格式:

public class LastFirst : Namer
{public LastFirst(string name){int i = name.IndexOf(",");if (i > 0){lName = name.Substring(0, i);frName = name.Substring(i + 1).Trim();}else{lName = name;frName = "";}}
}

这两个派生类都通过构造函数对传入的字符串进行解析,并将结果保存在基类字段中。


3. 构建简单工厂类 NamerFactory

public class NamerFactory
{public Namer CreateNamer(string name){if (name.Contains(","))return new LastFirst(name);elsereturn new FirstFirst(name);}
}

工厂类根据输入是否包含逗号来决定返回哪一个具体类的实例。


4. 客户端调用示例

class Program
{static void Main(string[] args){NamerFactory factory = new NamerFactory();Namer namer1 = factory.CreateNamer("John Doe");Console.WriteLine($"First Name: {namer1.GetFrname()}, Last Name: {namer1.GetLname()}");Namer namer2 = factory.CreateNamer("Doe, John");Console.WriteLine($"First Name: {namer2.GetFrname()}, Last Name: {namer2.GetLname()}");}
}

输出结果:

First Name: John, Last Name: Doe
First Name: John, Last Name: Doe

四、简单工厂模式的优点与局限

✅ 优点:

  1. 封装对象创建逻辑:客户端不需要关心具体类的创建过程,只需调用工厂接口。
  2. 提高可扩展性:新增一个具体类只需修改工厂逻辑,而不影响已有代码。
  3. 统一接口:所有返回对象都继承自同一个基类或接口,便于统一调用。

⚠️ 局限:

  1. 违反开放封闭原则:每次新增一个具体类,都需要修改工厂类的判断逻辑。
  2. 不适合大规模扩展:当具体类数量激增时,判断逻辑会变得复杂且难以维护。
  3. 不属于GoF模式:不被广泛认为是“标准”的设计模式,需谨慎使用。

五、简单工厂模式的适用场景

  1. 产品种类有限:适用于需要创建的对象类型不多的场景。
  2. 简化客户端调用:当客户端不希望处理复杂的对象创建逻辑时。
  3. 作为工厂方法模式的前奏:为后续引入更高级的工厂方法模式打下基础。

六、从简单工厂到工厂方法模式的演进

简单工厂模式虽然实用,但其“集中决策”的特性限制了它的扩展性。在工厂方法模式中,每个具体类都有自己的工厂类,客户端通过调用不同的工厂来获取实例,从而实现对扩展开放、对修改关闭的设计原则。

例如:

public interface INamerFactory
{Namer CreateNamer(string name);
}public class FirstFirstFactory : INamerFactory 
{public Namer CreateNamer(string name){return new FirstFirst(name);}
}

这种结构允许系统在不修改现有代码的情况下灵活扩展新的产品类型。


结语:选择合适的模式,构建高质量系统

简单工厂模式作为一个轻量级的设计模式,非常适合在中小型项目或模块中使用。它可以帮助我们快速实现对象的创建逻辑封装,提高代码的可读性和可维护性。然而,随着业务逻辑的复杂化和对象种类的增加,我们应考虑向更高级的设计模式(如工厂方法模式、抽象工厂模式)进行演进。

设计模式的本质,不是为了炫技,而是为了更好地组织代码、提高系统的可维护性与可扩展性。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94535.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94535.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/94535.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全面解析JVM预热:原理、价值与实践指南

在Java应用的性能优化领域,“JVM预热”是一个常被提及却容易被忽视的关键环节。尤其是在高并发、低延迟的业务场景中,未经过充分预热的JVM可能导致应用启动初期出现响应延迟、吞吐量波动甚至服务不可用的问题。本文将从JVM预热的核心原理出发,深入剖析其价值、常见实现方案及…

数学建模-灰色关联分析(GRA)

目录 1-AI带你认识GRA 📘 一、灰色关联分析(GRA)简介 1. 什么是灰色关联分析? 2. 核心思想(通俗理解): 3. 与熵权法的对比(快速类比): 🧩 二…

Shell脚本-expect

一、前言在 Linux 系统管理与自动化运维中,我们经常需要编写 Shell 脚本来完成各种任务。但有些命令(如 ssh、scp、passwd、ftp 等)在执行时会等待用户手动输入密码或确认信息,这就导致脚本无法完全自动化运行。为了解决这个问题&…

Conmi的正确答案——Ubuntu24.04禁用任何休眠

系统:Ubuntu 24.04步骤一、禁用系统休眠服务 # 禁用所有休眠/待机相关服务(立即生效) sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target # 验证状态(显示 "masked" 即成功&am…

开源 C++ QT Widget 开发(二)基本控件应用

文章的目的为了记录使用C 进行QT Widget 开发学习的经历。临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。 相关链接: 开源 C QT Widget 开发(一)工程文件结构-CSDN博客 开源 C…

今日科技风向|从AI芯片定制到阅兵高科技展示——聚焦技术前沿洞察

今日科技风向|从AI芯片定制到阅兵高科技展示——聚焦技术前沿洞察 一、NVIDIA 开发“黑曜”子版 AI 芯片 B30A,瞄准中国市场 今日报道指出,NVIDIA 正在研发一款面向中国市场的定制芯片 B30A,基于其先进的 Blackwell 架构&#xff…

Elasticsearch官方文档学习-未完待续

Elasticsearch官方文档学习-未完待续说明快速开始基础知识索引组成1. 文档 (Documents)2. 元数据字段(Metadata fields)3. 映射和数据类型(Mappings and data types)文档操作(Document)批量创建或者删除文档 (Bulk index or delete documents)乐观并发控制 Optimistic concurre…

Redis资料

Redis是什么? Redis(Remote Dictionary Server)是一个开源的、基于内存的键值数据库,支持多种数据结构,可用作数据库、缓存和消息中间件。主要特点包括: 基于内存操作,读写性能极高支持持久化,可将内存数…

CAMEL-Task2-Agent的构成组件

CAMEL-Task2-Agent的构成组件 本文笔记主要关于2.7章节:CAMEL框架中agents如何使用工具。 一、工具说明 为什么要额外使用工具? agents本身的知识和能力有限,比如一些问题需要联网搜索才能准确回答(而不是乱答,即“…

数据整理自动化 - 让AI成为你的数据助手

文章目录数据整理自动化 - 让AI成为你的数据助手引言:数据整理的时代挑战与机遇1. 常见数据整理场景分析1.1 数据整理的多元场景图谱1.2 数据质量问题的分类与影响1.3 传统处理方法的局限性2. AI与传统脚本的协同工作流2.1 智能数据整理架构设计2.2 协同工作流的最佳…

react速成

项目目录package.json文件:包含核心两个依赖(react、react-dom)和命令(start、bulid)src:源码目录,开始之用的到index.js和App.jsindex.js:是项目的入口,一切的运行起点/…

Maven的进阶使用(上)

pom.xml文件 就像 Make 的 MakeFile、Ant 的 build.xml 一样,Maven 项目的核心是 pom.xml。POM(全称 Project Object Model,项目对象模型 ) 定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。 Gredele--…

【最后203篇系列】034 使用SQLite构建简单的任务管理

表数据同步的断点续传 有时候需要将一个表的数据复制到另一个表,循环是常用的方式。当表比较大,执行的时间很长,会有很多因素引起失败。我希望可以比较简单的跑数,所以做一个简单的任务系统。 SQLitre是嵌入式数据库,这…

SpringCloud Alibaba核心知识点

Spring Cloud Alibaba 是阿里巴巴开源的一套微服务解决方案,与 Spring Cloud 生态深度集成。以下是其主要组件及其功能:Nacos服务注册与发现:支持动态服务注册、健康监测及DNS-Based服务发现。配置中心:提供分布式配置管理&#x…

LeetCode 分类刷题:34. 在排序数组中查找元素的第一个和最后一个位置

题目给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。示例 1:…

自建知识库,向量数据库 (十二)之 文章向量搜索——仙盟创梦IDE

“未来之窗” 文章向量搜索:多领域应用与学习指南 在数字化浪潮中,“未来之窗” 文章向量搜索凭借其独特的技术优势,在酒店、电商、诊疗及知识库等多个领域展现出巨大的应用潜力,为各行业的信息处理与检索带来了全新的视角和高效…

深度剖析:基于反射的.NET二进制序列化器设计与实现

🔍 深度剖析:基于反射的.NET二进制序列化器设计与实现本文将从底层原理到高级优化,全面剖析一个基于反射的.NET二进制序列化器的设计与实现,涵盖类型系统处理、内存布局、递归算法、性能优化等核心主题。1. 设计哲学与架构总览 1.…

如何在 Ubuntu 上安装和配置 Samba ?

Samba 是一个开源程序,用于文件共享和网络打印,使用 SMB 协议。现在基本上用于提供在 Windows 上可访问的 Linux 文件共享系统。 本文介绍如何在 Ubuntu 上安装和配置 Samba 服务器,以便跨文件夹共享网络上不同的计算机。 Update Your Syst…

MATLAB实现CNN-GRU-Attention时序和空间特征结合-融合注意力机制混合神经网络模型的风速预测

该 MATLAB 代码实现了一个基于 CNN-GRU-Attention 时序和空间特征结合-融合注意力机制混合神经网络模型的风速预测。以下是对代码的简要分析:一、主要功能 该代码用于风速时间序列预测,使用历史风速特征数据(18个特征,75天&#x…

【升级版】从零到一训练一个 0.6B 的 MoE 大语言模型

前文:从零到一训练一个 0.6B 的 MoE 大语言模型,本次升级完全重新从零开始重新训练。主要升级如下: 替换预训练数据集,使用序列猴子通用文本数据集进行预训练。使用更先进的训练方法。新增思考模式控制,可通过添加/th…