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

2023-09-14 13:05:03

专栏介绍

专栏地址

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 {
    @Override
    public void use() {
        System.out.println("Product A is being used.");
    }
}

public class ProductB implements Product {
    @Override
    public 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() 方法来创建具体产品对象。客户端只需知道产品的类型,而无需关心具体的创建细节。这样可以降低客户端与具体产品类之间的耦合度,并且方便了产品类型的扩展和维护。

优缺点分析

优点

封装了对象的创建过程

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

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

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

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

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

缺点

违反了开闭原则

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

工厂类职责过重

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

总结

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

在这里插入图片描述

更多推荐

线性代数基础-矩阵

八、矩阵的基础概念1.矩阵我们忘掉之前行列式的一切,列一种全新的数表,虽然长得很像,但是大不相同,首先一个区别就是矩阵不能展开成一个值,这里不讨论矩阵的空间意义{a11x1+a12x2+a13x3+...+a1nxn=b1a21x1+a22x2+a23x3+...+a2nxn=b2...an1x1+an2x2+an3x

SQL sever中相关查询

目录一、简单查询二、条件查询三、别名查询四、分组查询五、排序查询六、去重查询七、分页查询八、模糊查询九、表连接查询十、子查询十一、嵌套查询一、简单查询简单查询是最基本的查询类型,用于从数据库中选择特定列或所有列的数据。1.选择所有列的数据:SELECT*FROM表名;将返回指定表中的所有行和列。2.选择特定列的数据:S

酌情参考——chatGPT给的一些语义框架的学术思路,语义和图谱结合似乎是个不错的方向

语义和图谱结合似乎是个不错的方向我在分析教师讲课的文本,以知识元和语义框架建模的话怎么分析合适ChatGPT分析教师讲课的文本并建立知识元和语义框架的模型可以帮助你理解教师的教学内容以及课程结构。以下是一些步骤和方法,可帮助你进行这种分析:数据收集:收集教师讲课的文本或音频记录,这些记录可以是课堂讲座、教材、学生笔记或

什么是IoT数字孪生?

数字孪生是资产或系统的实时虚拟模型,它使用来自连接的物联网传感器的数据来创建数字表示。数字孪生允许您从任何地方实时监控设备、资产或流程。数字孪生用于多种目的,例如分析性能、监控问题或在实施之前运行测试。从物联网数字孪生中获得的见解使用户能够快速做出反应,以提高运营效率、生产质量、客户满意度等。基于NSDT场景编辑器搭建

docker总结

Docker实用篇0.学习目标1.初识Docker1.1.什么是Docker微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署,环境不一定一致,会遇到各种问题1.1.1.应用部署的环境问题大型项目组件较多

CLR via C#(三)垃圾回收

一、资源生命周期每个程序运行都需要各种资源,如文件、内存缓冲区、数据库等。要使用这些资源,就必须为代表资源的类型分配内存。访问一个资源所需的步骤如下:调用IL指令newobj,为代表资源的类型分配内存(在C#中一般用new操作符完成)初始化内存,设置资源的初始状态并使资源可用访问类型成员来使用资源摧毁资源状态以进行清理

多线程的学习第二篇

多线程线程是为了解决并发编程引入的机制.线程相比于进程来说,更轻量~~更轻量的体现:创建线程比创建进程,开销更小销毁线程比销毁进程,开销更小调度线程比调度进程,开销更小进程是包含线程的.同一个进程里的若干线程之间,共享着内存资源和文件描述符表每个线程被独立调度执行.每个线程都有自己的状态/优先级/上下文/记账信息进程是

Apache Tomcat

简介简而言之,Tomcat是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器。ApacheTomcatTomcat是Apache软件基金会(ApacheSoftwareFoundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支

Responder

环境准备操作系统:KaliLinux工具:responder,john,evil-winrmPS:输入以下命令解决靶场环境无法打开问题#echo"<靶机IP>unika.htb">>/etc/hostsresponder工具[Kali官网]手册地址:https://www.kali.org/tools/responde

NSS [HNCTF 2022 WEEK2]easy_sql

NSS[HNCTF2022WEEK2]easy_sql这题考察了无列名注入,首先了解一下什么是无列名注入再开始做题吧。为什么会需要无列名注入?我们常用的SQL注入方法是通过information_schema这个默认数据库来实现,可是你有没有想过,如果过滤了该数据库那么我们就不能通过这个库来查出表名和列名。不过我们可以

UWB定位模块

UWB定位模组是华星智控自研的小尺寸高集成度模组,模组长宽厚为30.1513.955.62毫米,天线采用IPEX接口分体式设计,方便集成于您的产品中,产品采用本安设计,可以用于煤矿等井下场景,通信距离>100米,供电电压3.7V,支持标准锂电池供电。该模块定位精度可到10~30厘米,适合集成在各种需要高精度测距和定位产

热文推荐