小谈设计模式(2)—简单工厂模式

小谈设计模式(2)—简单工厂模式

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 简单工厂模式
    • 简单工厂模式组成
      • 抽象产品(Abstract Product)
      • 具体产品(Concrete Product)
      • 简单工厂(Simple Factory)
      • 三者关系
    • 核心思想
    • Java代码实现
      • 首先,我们定义一个抽象产品接口 Product,其中包含一个抽象方法 use():
      • 然后,我们创建两个具体产品类 ProductA 和 ProductB,它们实现了抽象产品接口 Product:
      • 接下来,我们创建一个简单工厂类 SimpleFactory,它包含一个静态方法 createProduct(String type),根据传入的参数类型创建相应的产品对象:
      • 最后,我们可以在客户端代码中使用简单工厂模式来创建具体产品对象:
      • 代码分析
    • 优缺点分析
      • 优点
        • 封装了对象的创建过程
        • 降低了客户端与具体产品类之间的耦合度
        • 方便了产品类型的扩展和维护
      • 缺点
        • 违反了开闭原则
        • 工厂类职责过重
    • 总结

专栏介绍

专栏地址

link

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

简单工厂模式

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式,通过将对象的创建逻辑封装在一个工厂类中,客户端不需要知道具体的创建细节,只需要向工厂类请求所需对象即可。

简单工厂模式组成

在简单工厂模式中,主要涉及三个角色:抽象产品、具体产品和简单工厂。

抽象产品(Abstract Product)

抽象产品是具体产品类的共同接口,它定义了产品的通用方法。抽象产品可以是一个接口或抽象类,具体的实现由具体产品类来完成。

具体产品(Concrete Product)

具体产品是抽象产品的实现类,它实现了抽象产品中定义的方法。在简单工厂模式中,每个具体产品都对应一个具体的产品类。

简单工厂(Simple Factory)

简单工厂是一个包含创建产品对象的静态方法的类。它根据客户端的请求创建相应的具体产品对象,并返回给客户端使用。简单工厂隐藏了对象的创建细节,客户端只需通过工厂类获取所需对象,而无需直接实例化具体产品类。
在这里插入图片描述

三者关系

1、抽象产品通过定义产品的通用接口,规范了具体产品的行为。
2、具体产品是抽象产品的实现类,负责实现抽象产品中定义的方法。
3、简单工厂作为一个工厂类,封装了对象的创建过程。它根据客户端的请求创建相应的具体产品对象,并返回给客户端使用。

核心思想

将对象的创建过程封装在一个工厂类中,客户端只需通过工厂类的静态方法来获取所需对象,而无需直接实例化具体产品类。这样可以降低客户端与具体产品类之间的耦合度,并且方便了产品类型的扩展和维护。
在这里插入图片描述

Java代码实现

首先,我们定义一个抽象产品接口 Product,其中包含一个抽象方法 use():

public interface Product {void use();
}

然后,我们创建两个具体产品类 ProductA 和 ProductB,它们实现了抽象产品接口 Product:

public class ProductA implements Product {@Overridepublic void use() {System.out.println("Product A is being used.");}
}public class ProductB implements Product {@Overridepublic void use() {System.out.println("Product B is being used.");}
}

在这里插入图片描述

接下来,我们创建一个简单工厂类 SimpleFactory,它包含一个静态方法 createProduct(String type),根据传入的参数类型创建相应的产品对象:

public class SimpleFactory {public static Product createProduct(String type) {if (type.equals("A")) {return new ProductA();} else if (type.equals("B")) {return new ProductB();}return null;}
}

最后,我们可以在客户端代码中使用简单工厂模式来创建具体产品对象:

//客户端
public class Client {public static void main(String[] args) {Product productA = SimpleFactory.createProduct("A");productA.use();  // Output: Product A is being used.Product productB = SimpleFactory.createProduct("B");productB.use();  // Output: Product B is being used.}
}

在这里插入图片描述

代码分析

客户端通过调用 SimpleFactory.createProduct() 方法来创建具体产品对象,而无需直接实例化具体产品类。这样,客户端与具体产品之间的耦合度降低了,同时也方便了产品类型的扩展和维护。

简单工厂类 SimpleFactory 包含一个静态方法 createProduct(String type),该方法根据传入的参数类型创建相应的产品对象。在实际应用中,根据具体需求可以使用更复杂的逻辑来创建对象,例如读取配置文件或数据库来确定创建哪个具体产品。

在客户端代码中,我们通过调用 SimpleFactory.createProduct() 方法来创建具体产品对象。客户端只需知道产品的类型,而无需关心具体的创建细节。这样可以降低客户端与具体产品类之间的耦合度,并且方便了产品类型的扩展和维护。

优缺点分析

优点

封装了对象的创建过程

简单工厂模式将对象的创建过程封装在一个工厂类中,客户端只需知道产品的类型,而无需关心具体的创建细节。这样可以降低客户端的复杂性,并且方便了产品类型的扩展和维护。

降低了客户端与具体产品类之间的耦合度

客户端只需通过工厂类获取所需对象,而无需直接实例化具体产品类。这样可以降低客户端与具体产品类之间的依赖关系,使客户端代码更加灵活和可维护。
在这里插入图片描述

方便了产品类型的扩展和维护

在简单工厂模式中,如果需要新增产品类型,只需修改工厂类的代码即可。这样可以方便地添加新的产品类型,而无需修改客户端代码。同时,也方便了产品类型的维护,集中管理了对象的创建过程。

缺点

违反了开闭原则

在简单工厂模式中,当新增产品类型时,需要修改工厂类的代码。这违反了开闭原则,对于已经存在的代码进行修改可能会引入新的风险。因此,如果产品类型经常变化,不适合使用简单工厂模式。

工厂类职责过重

在简单工厂模式中,工厂类负责创建所有的产品对象。随着产品类型的增多,工厂类的代码会变得越来越复杂,职责过重。这违反了单一职责原则,不利于代码的维护和扩展。

总结

简单工厂模式是一种简单且常用的创建型设计模式,适用于创建对象较少且相对简单的场景。它封装了对象的创建过程,降低了客户端的复杂性,并且方便了产品类型的扩展和维护。然而,简单工厂模式违反了开闭原则,对于产品类型经常变化的情况不适用。此外,工厂类的职责过重也是其缺点之一。因此,在实际应用中,需要根据具体情况选择合适的创建型模式。

在这里插入图片描述

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

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

相关文章

【MySQL】MySQL索引的定义、分类、Explain、索引失效和优化

索引的介绍 索引是帮助MySQL高效获取数据的数据结构 MySQL在存储数据之外,数据库系统中还维护着满足特定查找算法的数据结构,这些数据结构以某种引用(指向)表中的数据,这样我们就可以通过数据结构上实现的高级查找算法来快速找到我们想要的数…

JSP 学习笔记(基础)

出现背景: 由于 Servlet 输出 HTML 比较困难,所以出现了 JSP 这个代替品。 特点: 基于文本,HTML 和 Java 代码共同存在(用 write() 来写 HTML 标签)其本身就是个被封装后的 Servlet(被编译为…

springboot对接postgres

安装postgres 注意:下述链接方式会自动创建数据库steven_russell,若需要创建其他数据库,可以手动执行命令创建数据库 docker run --name postgres \ -p 5432:5432 \ -e POSTGRES_USERsteven_russell \ -e POSTGRES_PASSWORD123456 \ -itd --privilegedtrue postgre…

D数树,牛客小白月赛78,思维

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 “开导!” 众所周知&#…

BGP路由属性

任何一条BGP路由都拥有多个路径属性(Path Attributes),当路由器通告BGP路由给它的对等体时,该路由将会携带多个路径属性,这些属性描述了BGP路由的各项特征,同时在某些场景下也会影响BGP路由优选的决策。 一…

【Flink】FlinkCDC获取mysql数据时间类型差8小时时区解决方案

1、背景: 在我们使用FlinkCDC采集mysql数据的时候,日期类型是我们很常见的类型,但是FlinkCDC读取出来会和数据库的日期时间不一致,情况如下 FlinkCDC获取的数据中create_time字段1694597238000转换为时间戳2023-09-13 17:27:18 而数据库中原始数据如下,并没有到下午5点…

01.qtcreator介绍

四、创建第一个qtcreator项目并确定文件和目录的作用 bin: 存放编译好输出的dll文件和执行文件 doc: 存放文档 lib: 存放库文件 src: 存放源码 注意: QtCreator创建路径不要使用中文路径;创建.h和.cpp文件时,使用小写;windows大…

解读|美创深度参与5项电信和互联网行业数据安全标准发布实施

《数据安全法》、《个人信息保护法》等法律法规的颁布实施,坚持安全和发展并重的原则,积极应对复杂严峻的安全风险与挑战,加速构建数据安全保障体系,成为电信和互联网行业重要工作。 “安全发展、标准先行”,标准化工作…

一文详解TCP三次握手四次挥手

文章目录 TCP的三次握手和四次挥手三次握手四次挥手 TCP的三次握手和四次挥手 基本概念 SYN(Synchronize Sequence Numbers,同步序列数字):用于建立连接的同步信号。 SYN 序列号的作用是用于标识每个数据包中的字节流的起始位置。…

线上论坛之单元测试

对线上论坛进行单元测试的测试报告 源码地址:https://gitee.com/coisini-thirty-three/forum 一、用户部分(UserServiceImplTest) 1.创建普通用户 测试名称 createNormalUser() 测试源码 Test void createNormalUser() { // 构造用户 User …

指针和数组笔试题解析

大家好,我们今天来学习有关于指针和数组的笔试题解析。 在之前的C语言学习中我们知道了数组名代表的是数组首元素的地址,而有两个例外,就是sizeof中和&符操作取的就是整个数组的地址,那么我们今天的学习重点就是这些关于数组…

哈希(hash)——【C++实现】

本章gitee代码仓库:Hash 文章目录 💐1. 哈希概念🌻2. 哈希冲突🌼3. 哈希函数🌸3.1 哈希函数设计原则🌸3.2 常见哈希函数 🪴4. 哈希冲突解决方案🌱4.1 闭散列——开放定址法&#x1f…

【ROS】Ubuntu20.04+ROS Noetic 配置PX4-v1.12.2和Gazebo11联合仿真环境【教程】

【ROS】Ubuntu20.04ROS Noetic 配置PX4-v-v1.12.2和Gazebo11联合仿真环境【教程】 文章目录 【ROS】Ubuntu20.04ROS Noetic 配置PX4-v-v1.12.2和Gazebo11联合仿真环境【教程】0. 安装UbuntuROS1. 安装依赖2. 安装QGC地面站3. 配置PX4-v1.12.23.1 安装PX43.2 测试PX4是否成功安装…

Java常见面试题(含答案,持续更新中~~)

目录 1、JVM、JRE和JDK的关系 2、什么是字节码?采用字节码的最大好处是什么 3、Java和C的区别与联系 4、Java和GO的区别与联系 5、 和 equals 的区别是什么? 6、Oracle JDK 和 OpenJDK 的对比 7、String 属于基础的数据类型吗? 8、fi…

外星人入侵游戏-(创新版)

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…

【Tensorflow 2.12 电影推荐项目搭建】

Tensorflow 2.12 电影推荐项目搭建 学习笔记工具、环境创建项目项目配置安装相关python包召回模型实现排序模型实现实现电影推荐导入模块设置要推荐的用户召回推荐排序推荐推荐结果结尾学习笔记 Tensorflow 2.12 电影推荐项目搭建记录~ Tensorflow是谷歌开源的机器学习框架,可…

再次理解Android账号管理体系

目录 ✅ 0. 需求 📂 1. 前言 🔱 2. 使用 2.1 账户体系前提 2.2 创建账户服务 2.3 操作账户-增删改查 💠 3. 源码流程 ✅ 0. 需求 试想,自己去实现一个账号管理体系,该如何做呢? ——————————…

MySQL 学习笔记(基础)

首先解释数据库DataBase(DB):即存储数据的仓库,数据经过有组织的存储 数据库管理系统DataBase Management System(DBMS):管理数据库的软件 SQL(Structured Query Language&#xf…

3D视觉到三维视觉之结构光

3D视觉是计算机视觉的终极体现形式 2D视觉技术主要在二维空间下完成工作,三维信息基本上没有得到任何利用,而三维信息才真正能够反映物体和环境的状态,也更接近人类的感知模式。近年来,学术界和工业界推出了一系列优秀的算法和产…

redis 哨兵(sentinel)机制

1. 前言 sentinel(哨兵)是Redis 的高可用性解决方案之一。通过哨兵可以创建一个当主服务器出现故障时自动将从服务器升级为主服务器的分布式系统,解决了主从复制出现故障时需要人为干预的问题。 redis 的主从复制的作用有数据预热、负载均衡…