技术成神之路:设计模式(四)工厂方法模式

1.定义


工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,而不是通过具体类来实例化对象。工厂方法模式的主要作用是让子类决定实例化哪一个类,从而实现对象创建的延迟到具体子类中进行。

2.主要作用


作用就是使设计更加灵活和可扩展。通过这种方式,父类无需知道具体要创建的对象是哪一种,这样就提高了系统的可扩展性和可维护性(符合开闭原则)一切优秀的模式都向设计原则看齐。

3.解决的问题

说到解决的问题,这里就不得不提下简单工厂模式了,什么?你不知道简单工厂模式是什么,没关系,先来看下定义:

简单工厂模式是一种创建型模式,它定义了一个工厂类,该类包含一个方法,根据给定的参数来返回不同类的实例。
客户端通过向工厂类传递参数来获取所需的具体对象实例,而不需要直接实例化对象。

包含角色:

  1. 工厂类(Factory):负责根据客户端的请求创建相应的对象。

  2. 产品类(Product):被创建的对象的基类或接口。具体的产品类是工厂类所创建的对象类型。

  3. 具体产品类(Concrete Product):实现了产品接口的具体对象类,由工厂类根据客户端的需求创建和返回。

UML类图:
在这里插入图片描述
代码示例:

public class LoggerFactory {public static Logger createLogger(String logType) {if ("Console".equals(logType)) {return new ConsoleLogger();} else if ("File".equals(logType)) {return new FileLogger();} else if ("Remote".equals(logType)) {return new RemoteLogger();} else {throw new IllegalArgumentException("Unsupported log type");}}
}

通过 LoggerFactory.createLogger("Console")LoggerFactory.createLogger("File") 或者 LoggerFactory.createLogger("Remote") 来获取不同类型的日志记录器,这种方式就是简单工厂模式,熟不熟悉,在你的项目中是不是也使用过这种模式呢,由于不难理解所以称为简单

简单是简单,当然他也有一些弊端,如果上面示例代码中 Logger 抽象类中只有打印一个方法,后续需要新增保存日志,过滤日志… 问题就暴露出来了,简单来说就是 简单工厂模式违反了开闭原则,即对扩展开放,对修改关闭

工厂方法模式解决了简单工厂模式的哪些问题?

  • 开闭原则:工厂方法模式遵循开闭原则,通过定义抽象工厂类和具体工厂类的继承关系,新增产品时只需增加具体工厂类和产品类,而无需修改现有代码,降低了系统的耦合性。
  • 扩展性:工厂方法模式支持更多的灵活性,每个具体的工厂类只负责创建对应的产品,符合单一职责原则,代码更加清晰和可维护。
  • 维护性:由于工厂方法模式将对象的创建延迟到子类中,避免了简单工厂模式中工厂类集中所有产品创建逻辑的问题,使代码结构更加清晰和可扩展。

简单来说,就是解决了简单工厂模式中集中创建逻辑和不符合开闭原则的问题,提高了代码的灵活性和可维护性。

4.模式原理

包含角色:

  1. 产品(Product):定义产品的接口。
  2. 具体产品(ConcreteProduct):实现产品接口的具体类。
  3. 工厂(Factory):定义创建产品对象的接口。
  4. 具体工厂(ConcreteFactory):实现创建产品对象的具体类。

UML类图:
在这里插入图片描述

// 定义产品接口
public interface Product {String operation();
}// 定义具体产品类
public class ConcreteProductA implements Product {@Overridepublic String operation() {return "产品A";}
}public class ConcreteProductB implements Product {@Overridepublic String operation() {return "产品B";}
}// 定义工厂接口
public abstract class Creator {// 工厂方法public abstract Product factoryMethod();// 其它操作方法public String someOperation() {Product product = factoryMethod();return product.operation();}
}// 定义具体工厂类
public class ConcreteCreatorA extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProductA();}
}public class ConcreteCreatorB extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProductB();}
}// 客户端代码
public class Client {public static void main(String[] args) {clientCode(new ConcreteCreatorA());clientCode(new ConcreteCreatorB());}public static void clientCode(Creator creator) {System.out.println("Client: " + creator.someOperation());}
}

打印:

Client: 产品A
Client: 产品B

相较简单工厂模式 增加了一个具体工厂角色,每增加一个具体产品,需要同时增加一个具体工厂类。所以说各有优缺点吧。

4.优缺点


优点:

  • 遵循开闭原则:可以在引入新产品时不修改现有代码。
  • 遵循单一职责原则:将产品对象的创建逻辑封装在工厂类中。
  • 减少代码耦合:客户端不直接依赖于具体类,只依赖于抽象产品和工厂接口(符合依赖倒置原则)。.

缺点:

  • 增加代码复杂性:每增加一个具体产品,需要同时增加一个具体工厂类。
  • 类的数量增加:每个具体产品都需要一个对应的具体工厂,会导致类的数量增加。

5.应用场景


  1. 需要创建复杂对象:当对象的创建过程比较复杂,且需要多步操作时。
  2. 产品种类多且类型不确定:当系统中需要创建的产品种类较多且类型在运行时才确定时。
  3. 需要对创建过程进行控制:当需要对对象的创建过程进行控制,并且希望将控制逻辑封装起来时。

emm… 其实还是简单工厂模式 应用场景更广泛些,毕竟简单好用🤭

总结比较:

  • 简单工厂模式适合于对象类型较少且不经常变化的场景,代码较为简单,但不符合开闭原则,难以扩展新的产品类型。
  • 工厂方法模式更加符合开闭原则,通过增加新的具体工厂和具体产品类来扩展系统功能,但会增加系统中类的个数和复杂度。

6.总结


工厂模式解决了简单工厂模式中集中创建逻辑和不符合开闭原则的问题,但同时自身也有一些弊端,但通过合理应用工厂方法模式,在特定的场景可以有效地提高系统的可维护性和扩展性。

设计模式没有最好的,只有最适合的,大家在选用时,要权衡利弊,避免过度设计!

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

4.2 存储管理

大纲 页式存储必考,段式存储看运气 页式存储 概念

迅为RK3588开发板RKNPU2项目实战2SORT目标追踪

1.介绍和视频演示2.在模拟器实现图片的目标追踪3.连板推理和嵌入式部署4.视频目标追踪的实现(python)5.C实现目标追踪性能强--iTOP-3588开发板采用瑞芯微RK3588处理器,是全新一代ALoT高端应用芯片,采用8nm LP制程,搭载八核64位CPU&#xff0c…

飞睿智能6公里WiFi图传接收模块,低延迟、抗干扰、高速稳定传输数据,无人机、农田远距离WiFi模块

在科技日新月异的今天,无线通信技术正以前所未有的速度发展,不仅改变了我们的生活方式,还为企业带来了前所未有的商业机遇。今天,我要向大家介绍一款飞睿智能的产品——6公里WiFi图传接收模块,它以其高性能、稳定的传输…

ES13的4个改革性新特性

1、类字段声明 在 ES13 之前,类字段只能在构造函数中声明, ES13 消除了这个限制 // 之前 class Car {constructor() {this.color = blue;this.age = 2

SpringBoot实现简单AI问答(百度千帆)

第一步&#xff1a;注册并登录百度智能云&#xff0c;创建应用并获取自己的APIKey与SecretKey&#xff0c;参考网址&#xff1a; 点击去百度智能云 第二步&#xff1a;引入千帆的pom依赖 <dependency><groupId>com.baidubce</groupId><artifactId>q…

python库(9):prettytable库快速实现ASCII表格

下面介绍一个快速制作ASCII表格库——prettytable&#xff0c;可以方便地制作简单表格。 1 安装prettytable pip install -i https://pypi.tuna.tsinghua.edu.cn/simple prettytable 结果如下&#xff1a; 2 代码实例 from prettytable import PrettyTable table PrettyTa…

CloudCanal监控告警配置问题

前言&#xff1a; 近日有几个库需要同步到另外一台机做备份&#xff0c;想起Cloudcanal 比较方便&#xff0c;那就尝试用下 Cloudcanal 做同步&#xff0c;但是同步任务建立好之后&#xff0c;需要做监控&#xff0c;不然那天停止同步了都不知道&#xff0c;真所谓有应用必上监…

CVE-2024-6387Open SSH漏洞彻底解决举措(含踩坑内容)

一、漏洞名称 OpenSSH 远程代码执行漏洞(CVE-2024-6387) 二、漏洞概述 Open SSH是基于SSH协议的安全网络通信工具&#xff0c;广泛应用于远程服务器管理、加密文件传输、端口转发、远程控制等多个领域。近日被爆出存在一个远程代码执行漏洞&#xff0c;由于Open SSH服务器端…

高可用hadoop分布式节点的扩容

解决方案 修改hdfs-site.xml 文件 原xml文件 <?xml version"1.0" encoding"UTF-8"?> <?xml-stylesheet type"text/xsl" href"configuration.xsl"?> <!--Licensed under the Apache License, Version 2.0 (th…

华盈生物获得美国Akoya认证的PhenoCycler-Fusion(原CODEX)技术服务商

华盈生物获得美国Akoya认证的PhenoCycler-Fusion&#xff08;原CODEX&#xff09;技术服务商 华盈生物获得美国Akoya公司认证的PhenoCycler-Fusion&#xff08;原CODEX&#xff09;空间单细胞蛋白组技术服务商&#xff0c;并进入该技术的全球CRO服务提供者网络&#xff1a;htt…

java设计模式(十三)模版方法模式(Template Method Pattern)

1、模式介绍&#xff1a; 模版方法模式是一种行为型设计模式&#xff0c;定义了一个操作中的算法框架&#xff0c;将一些步骤延迟到子类中实现。模版方法使得子类可以在不改变算法结构的情况下&#xff0c;重新定义算法中的某些步骤。 2、应用场景&#xff1a; 算法框架固定…

Python酷库之旅-第三方库Pandas(013)

目录 一、用法精讲 31、pandas.read_feather函数 31-1、语法 31-2、参数 31-3、功能 31-4、返回值 31-5、说明 31-6、用法 31-6-1、数据准备 31-6-2、代码示例 31-6-3、结果输出 32、pandas.DataFrame.to_feather函数 32-1、语法 32-2、参数 32-3、功能 32-4、…

小白学c嘎嘎(第二天)入门基础下

温馨提醒&#xff1a;本篇文章起&#xff0c;文章内容排版将更新&#xff0c;层层深入 基础知识 回顾 引用的语法格式&#xff1a;类型& 引⽤别名 引⽤对象; 引用特性 1. 引⽤在定义时必须初始化 2. ⼀个变量可以有多个引⽤ 3. ⼀旦引⽤⼀个实体&#xff0c;再不…

android Dialog全屏沉浸式状态栏实现

在Android中&#xff0c;创建沉浸式状态栏通常意味着让状态栏背景与应用的主题颜色一致&#xff0c;并且让对话框在状态栏下面显示&#xff0c;而不是浮动。为了实现这一点&#xff0c;你可以使用以下代码片段&#xff1a; 1、实际效果图&#xff1a; 2、代码实现&#xff1a;…

【解读大模型(LLM)的token】

文末有福利&#xff01; 当人们谈论大型语言模型的大小时&#xff0c;参数会让我们了解神经网络的结构有多复杂&#xff0c;而token的大小会让我们知道有多少数据用于训练参数。 正像陆奇博士所说的那样&#xff0c;大型语言模型为从文本生成到问题回答的各种任务提供了令人印象…

11410-00SF 同轴连接器

型号简介 11410-00SF是Southwest Microwave的连接器。该连接器的外壳采用优质不锈钢&#xff0c;材质为 CRES ALLOY UNS-S303500&#xff0c;符合 ASTM-A582 标准。首先&#xff0c;不锈钢材料经过锻造加工&#xff0c;形成转接器的基本形状。然后&#xff0c;外壳进行精密的 C…

雷池WAF动态防护功能初体验

一、 介绍 大名鼎鼎的雷池WAF最近新上了个名为 动态防护 的功能 所谓动态防护&#xff0c;是在用户浏览到的网页内容不变的情况下&#xff0c;将网页赋予动态特性&#xff0c;即使是静态页面&#xff0c;也会具有动态的随机性。 说白了就是给你网站的 html 和 js 代码加上加密…

WEB安全:网络安全常用术语

一、攻击类别 漏洞&#xff1a;硬件、软件、协议&#xff0c;代码层次的缺陷。 后⻔&#xff1a;方便后续进行系统留下的隐蔽后⻔程序。 病毒&#xff1a;一种可以自我复制并传播&#xff0c;感染计算机和网络系统的恶意软件(Malware)&#xff0c;它能损害数据、系统功能或拦…

浅谈“不要卷模型,要卷应用”

目录 1.概述 2.AI技术应用场景探索 3.避免超级应用陷阱的策略 3.1.追求DAU的弊端 3.2.平衡用户活跃度与应用实用性的策略 4.个性化智能体开发 4.1. 用户需求分析与数据收集 4.2. 技术选择与开发 4.3. 个性化算法设计 4.4. 安全性与隐私保护 4.5. 多渠道集成与响应机…

防火墙安全策略用户认证综合实验

目录 一、拓扑图 二、实验要求 三、实验步骤 步骤1&#xff1a;配置防火墙接口 步骤2&#xff1a;配置ISP 步骤3&#xff1a;配置交换机LSW1 步骤4&#xff1a;配置PC端、客户端、服务器端 需求1&#xff1a;针对访问DMZ区内的服务器 ​编辑测试需求1: 需求2&#xff…