【设计模式-简单工厂】

定义

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,用于通过一个工厂类来创建某个产品类的实例,而不直接在客户端(调用方)中实例化对象

这种模式的主要思想是将对象的创建逻辑集中在一个地方,客户端只需要知道工厂提供的接口或方法,而无需关心具体产品类的实现细节。

组成

  • 工厂类(Factory):负责创建产品对象。工厂类包含一个方法,根据传入的参数来决定返回哪一个具体的产品类实例。
  • 产品类(Product):产品类是所有对象的父类或接口,定义了所有产品的公共接口或抽象类。
  • 具体产品类(ConcreteProduct):这些类是工厂类创建的实际对象,每个具体产品类实现了产品类定义的接口或继承了产品的抽象类。

简单工厂模式通常不是一个真正意义上的设计模式,而是一个编程技巧,因此它有时也被称为静态工厂方法模式。

代码

假设我们有一个场景,创建不同种类的汽车(Car)对象。通过简单工厂模式,我们可以定义一个工厂类,根据需要创建不同品牌的汽车对象。

// 产品接口(抽象产品类)
interface Car {void drive();
}// 具体产品类:宝马汽车
class BMW implements Car {@Overridepublic void drive() {System.out.println("Driving a BMW.");}
}// 具体产品类:奔驰汽车
class Benz implements Car {@Overridepublic void drive() {System.out.println("Driving a Benz.");}
}// 具体产品类:奥迪汽车
class Audi implements Car {@Overridepublic void drive() {System.out.println("Driving an Audi.");}
}// 简单工厂类
class CarFactory {public static Car createCar(String type) {switch (type) {case "BMW":return new BMW();case "Benz":return new Benz();case "Audi":return new Audi();default:throw new IllegalArgumentException("Unknown car type.");}}
}// 客户端代码
public class SimpleFactoryExample {public static void main(String[] args) {// 使用工厂类创建不同的汽车Car bmw = CarFactory.createCar("BMW");bmw.drive();Car benz = CarFactory.createCar("Benz");benz.drive();Car audi = CarFactory.createCar("Audi");audi.drive();}
}

代码说明:

  • Car 是产品接口,定义了所有汽车类需要实现的 drive() 方法。
  • BMW、Benz 和 Audi 是实现了 Car 接口的具体产品类。
  • CarFactory 是简单工厂类,它通过 createCar 方法根据传入的汽车类型(type)来返回具体的产品对象。
  • 在 SimpleFactoryExample 类中,客户端通过 CarFactory.createCar() 方法来创建不同类型的汽车对象,并调用它们的 drive() 方法。

优点

  • 集中管理对象创建:对象的创建逻辑集中在工厂类中,减少了客户端的复杂性。客户端只需要知道如何调用工厂方法,而不需要知道具体的产品类如何创建。
  • 减少代码重复:如果有多个地方需要创建相似的对象,工厂方法可以减少代码重复,确保对象创建的一致性。
  • 遵循单一职责原则:工厂类专注于对象的创建,客户端专注于业务逻辑,职责分离,代码更清晰。

缺点

  • 不易扩展:如果需要添加新的产品类(比如新增一种汽车类型),就需要修改工厂类的代码,这违反了开闭原则(Open-Closed Principle)。开闭原则要求对扩展开放,对修改关闭。
  • 产品类别有限制:简单工厂适合产品种类较少的场景。如果产品种类太多,工厂类可能会变得臃肿,包含大量 switch-case 或 if-else 语句,导致代码可读性和维护性降低。
  • 职责过重:随着产品种类的增加,工厂类可能承担过多职责,成为系统中的“上帝类”,这违背了设计中的单一职责原则。

场景

  • 产品种类较少:当需要创建的对象种类较少时,简单工厂模式是一个不错的选择,因为它的实现简单直观。
  • 客户端不关心产品的创建过程:如果客户端不关心对象如何被创建,只关心如何使用对象,那么可以使用简单工厂模式将对象的创建逻辑封装在工厂类中。
  • 需要避免代码重复:在系统的多个地方需要创建相似的对象时,工厂方法可以帮助减少代码重复,维护一致性。

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

  • 简单工厂模式:所有的对象创建都在一个工厂类中实现,通过传入参数来决定创建哪种产品类。这种模式适合简单的场景。
  • 工厂方法模式:通过定义一个工厂接口,并为每个产品类提供一个具体的工厂类来创建对应的产品。工厂方法模式符合开闭原则,增加新的产品时无需修改已有工厂类,只需新增对应的工厂类即可。
  • 抽象工厂模式:用于创建一系列相关的对象。抽象工厂模式为创建一组相关或相互依赖的对象提供了一个接口,而无需指定它们的具体类。

总结

简单工厂模式是实现对象创建的一种常见方式,能够将产品对象的创建集中到一个工厂类中,减少客户端的复杂性。虽然它易于理解和实现,但在产品种类较多时不容易扩展,因此适合用于简单场景。对于更复杂的场景,可能需要工厂方法模式或抽象工厂模式来增强灵活性和扩展性。

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

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

相关文章

判断自己的mac是macOS x64 还是macOS ARM64

在终端输入 uname -a 这样的是x64 这样的是ARM64

Skydel 24.9版本震撼发布,升级五大关键功能

在信号传播与仿真领域,Skydel软件一直是行业内的佼佼者。我们与您分享升级快讯,Skydel软件24.9.0版本已正式发布,此次更新不仅带来了五大全新功能,还在性能优化、用户体验以及远程API方面进行了全面升级,为用户带来更高…

面试题:如何能够保证T2在T1执行完后执行,T3在T2执行完后执行?——CountDownLatch原理

CountDownLatch的使用方式 CountDownLatch用于某个线程等待其他线程执行完任务再执行,与thread.join()功能类似。常见的应用场景是开启多个线程同时执行某个任务,等到所有任务执行完再执行特定操作,如汇总统计结果。 面试题:如何…

最新Java零基础知识(持续更新中......)

1. 学习前的准备 一个好的学习方法(如何更高效学习): 成为一名合格的程序员,需要具备两个关键能力: 指法速度:高效的代码输入速度。编程思想:能够用编程的方式解决现实问题的能力。 指法速度&am…

SpringBoot中的Component和ComponentScan注解工作原理

Spring IoC 容器的工作是通过管理对象的生命周期和配置来保持业务逻辑清晰,但是 Spring 容器并不会自动知道要管理哪些 bean。所以我们来告诉 Spring 应该处理哪些 bean 以及如何处理,很简单这就是 Spring 的 Component 和 ComponentScan 注释的作用所在…

算法题总结(二十)——并查集

并查集理论基础 并查集常用来解决集合连通性问题,两个节点在不在一个集合,也可以将两个节点添加到一个集合中。 大白话就是当我们需要判断两个元素是否在同一个集合里的时候,我们就要想到用并查集。 并查集主要有两个功能: 将…

linux介绍与基本指令

前言 本次博客将会讲解linux的来源历史、linux操作系统的理解以及它的一些基本指令。 1.linux的介绍 linux的来源 linux的来源最初还是要说到unix操作系统的。 1968年,一些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作…

C语言 | Leetcode C语言题解之第502题IPO

题目&#xff1a; 题解&#xff1a; #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAX_INT_NUMBER 0x7FFFFFFEtypedef struct {int capital;int profit; } ProNode;int CompareProfit(const ProNode *a, const ProNode *b) { /* 从大到小排序 */return b->pr…

根据发生异常的汇编指令以及函数调用堆栈,从内存的角度出发,估计出问题的可能原因,确定排查方向,快速定位C++软件问题

目录 1、前言 2、初步分析dump文件 3、加载更多模块的pdb文件&#xff0c;可能能看到更多行的函数调用堆栈 4、从内存的角度去看&#xff0c;估计是访问了野指针导致的&#xff0c;沿着这个怀疑的方向快速地定位了问题 5、最后 C软件异常排查从入门到精通系列教程&#xf…

力扣OJ算法题:合并两个有序链表

—————————————————————————————————————————— 正文开始 OJ算法题&#xff1a;合并两个有序链表 思路 创建一个新的空链表&#xff08;可以用malloc优化&#xff09;和两个指针L1、L2分别指向两个链表&#xff0c;遍历两个链表&am…

Chromium 中chrome.contextMenus扩展接口实现分析c++

一、chrome.contextMenus 使用 chrome.contextMenus API 向 Google Chrome 的上下文菜单中添加项。您可以选择从右键菜单中添加的对象类型&#xff0c;例如图片、超链接和页面。 权限 contextMenus 您必须在扩展程序的清单中声明 "contextMenus" 权限&#xff0c…

R语言机器学习算法实战系列(十二)线性判别分析分类算法 (Linear Discriminant Analysis)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍LDA的原理LDA的步骤教程下载数据加载R包导入数据数据预处理数据描述数据切割构建模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve保存模型总结优点:缺…

Ubuntu(22.04)本地部署Appsmith

Ubuntu&#xff08;22.04&#xff09;安装Appsmith 简要介绍 Appsmith 是一个开源的低代码开发平台&#xff0c;旨在帮助开发者和非开发者快速构建定制化的内部应用程序和管理工具。通过直观的拖拽界面和丰富的预配置组件&#xff0c;Appsmith 让用户无需编写大量代码即可创建…

Postman使用-基础篇

前言 本教程将结合业界广为推崇和使用的RestAPI设计典范Github API&#xff0c;详细介绍Postman接口测试工具的使用方法和实战技巧。 在开始这个教程之前&#xff0c;先聊一下为什么接口测试在现软件行业如此重要&#xff1f; 为什么我们要学习Postman&#xff1f; 现代软件…

数据轻松上云——Mbox边缘计算网关

随着工业4.0时代的到来&#xff0c;工厂数字化转型已成为提升生产效率、优化资源配置、增强企业竞争力的关键。我们凭借其先进的边缘计算网关与云平台技术&#xff0c;为工厂提供了高效、稳定的数据采集与上云解决方案。本文将为您介绍Mbox边缘计算网关如何配合明达云平台&…

基于SpringBoot微信小程序的书院预约系统【附源码】

基于SpringBoot微信小程序的书院预约系统 效果如下&#xff1a; 微信小程序首页界面 用户登录界面 书院信息界面 会议室界面 管理员登录界面 管理员主界面 用户界面 书院信息界面 会议室界面 会议室预约界面 研究背景 随着社会的快速发展&#xff0c;计算机技术的影响是全面…

SpringBoot 单元测试 - 登录认证在 Spring Boot 上的标准单元测试写法。

&#x1f449; 请投票支持这款 全新设计的脚手架 &#xff0c;让 Java 再次伟大&#xff01; 不要使用 SpringBootTest 使用 SpringBootTest 进行单元测试会启动整个 Spring Boot 容器&#xff0c;并引入整个项目的 development&test 依赖。缺点是速度慢、体积大、测试目标…

HarmonyOS Next应用开发——图像PixelMap变换

【高心星出品】 图像变换 图片处理指对PixelMap进行相关的操作&#xff0c;如获取图片信息、裁剪、缩放、偏移、旋转、翻转、设置透明度、读写像素数据等。图片处理主要包括图像变换、位图操作&#xff0c;本文介绍图像变换。 图形裁剪 // 裁剪图片 x&#xff0c;y为裁剪的起…

【element-tiptap】如何把分隔线改造成下拉框的形式?

当前的分隔线只有细横线这一种形式 但是咱们可以看一下wps中的分隔线&#xff0c;花里胡哨的 这些在wps里都需要使用快捷键打出来&#xff0c;真没找到菜单在哪里 那么这篇文章咱们就来看一下如何改造分隔线组件&#xff0c;改造成下拉框的形式&#xff0c;并且把咱们想要的分…

如何调试浏览器中的内存泄漏?

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介⭐ 如何调试浏览器中的内存泄漏&#xff1f;1. 什么是内存泄漏&#xff1f;2. 调试内存泄漏的工具3. 如何使用 Memory 面板进行内存调试3.1 获取内存快照&#xff08;Heap Snapshot&#xff09;获取内存快照的步骤&#xff1a;快照…