Java 设计模式 - 简单工厂模式 - 创建对象的简便之道

news2024/11/16 1:23:39

简单工厂模式是一种创建型设计模式,它提供了一种简单的方式来创建对象,而无需暴露对象创建的逻辑。在本篇博客中,我们将深入了解简单工厂模式的概念、实现方式以及如何在Java中使用它来创建对象。

为什么使用简单工厂模式?

在软件开发中,对象的创建是一个常见的任务。通常情况下,我们直接在代码中使用new关键字来创建对象。但是,这样做存在一些问题:

在这里插入图片描述

  1. 耦合性高:如果在代码中直接创建对象,那么类之间的耦合性将会增加。当需要更换对象时,需要修改代码,违反了开闭原则(对扩展开放,对修改关闭)。
  2. 代码重复:如果有多个地方需要创建相同的对象,那么代码中会出现重复的实例化逻辑,增加了代码的冗余性。
  3. 难以管理:随着应用程序的复杂度增加,对象的创建可能涉及到复杂的逻辑,这样会使代码变得难以维护和管理。

简单工厂模式的主要目的是解决上述问题。它通过一个工厂类来封装对象的创建逻辑,从而降低了类之间的耦合性,避免了代码重复,使代码更易于维护和管理。

简单工厂模式的实现方式

在简单工厂模式中,我们引入一个简单工厂类,它负责根据客户端的请求来创建对象。客户端不需要知道具体的创建细节,只需要通过工厂类获取所需的对象。

1. 创建产品接口

首先,我们需要定义一个产品接口,该接口将由工厂类创建的所有产品实现。

// 产品接口
public interface Product {
    void operate();
}

2. 创建产品实现类

接下来,我们创建两个产品实现类,它们都实现了上面定义的Product接口。

// 具体产品实现类A
public class ConcreteProductA implements Product {
    @Override
    public void operate() {
        System.out.println("Product A is operating.");
    }
}

// 具体产品实现类B
public class ConcreteProductB implements Product {
    @Override
    public void operate() {
        System.out.println("Product B is operating.");
    }
}

3. 创建简单工厂类

然后,我们创建一个简单工厂类SimpleFactory,该类负责根据客户端的请求来创建具体的产品实例。

public class SimpleFactory {
    // 根据客户端请求创建产品实例
    public static Product createProduct(String type) {
        if ("A".equals(type)) {
            return new ConcreteProductA();
        } else if ("B".equals(type)) {
            return new ConcreteProductB();
        } else {
            throw new IllegalArgumentException("Invalid product type.");
        }
    }
}

4. 使用简单工厂创建对象

现在我们可以在客户端代码中使用简单工厂来创建具体的产品对象。

public class Client {
    public static void main(String[] args) {
        // 通过简单工厂创建产品实例
        Product productA = SimpleFactory.createProduct("A");
        Product productB = SimpleFactory.createProduct("B");

        // 调用产品的操作方法
        productA.operate(); // Output: Product A is operating.
        productB.operate(); // Output: Product B is operating.
    }
}

简单工厂模式的优缺点

优点

  1. 降低耦合性:客户端代码只依赖于简单工厂,不需要知道具体的产品实现。当产品发生变化时,只需要修改简单工厂,而不需要修改客户端代码,降低了类之间的耦合性。
  2. 代码复用:避免了在多个地方重复创建对象的代码,提高了代码的复用性。
  3. 集中控制:简单工厂将对象的创建逻辑集中在一个地方,更易于管理和维护。

缺点

  1. 违反开闭原则:每次新增一个产品,都需要修改简单工厂类的代码,违反了开闭原则。
  2. 工厂类职责过重:随着产品的增多,简单工厂类的职责会越来越重,不利于扩展和维护。

总结

简单工厂模式是一种创建型设计模式,它通过一个工厂类来封装对象的创建逻辑,从而降低了类之间的耦合性,避免了代码重复,使代码更易于维护和管理。在Java中,简单工厂模式通常用于创建对象的场景,通过一个工厂类来隐藏对象的创建细节,使客户端代码更简洁、可维护和可扩展。

通过此篇文章,让我们对简单工厂模式有了更深入的理解。在实际应用中,根据具体场景选择适合的设计模式是非常重要的。简单工厂模式是一种简便的方式来创建对象,但也需要考虑其优缺点,并根据实际情况做出选择。

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

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

相关文章

PC音频框架学习

1.整体链路 下行播放: App下发音源→CPU Audio Engine 信号处理→DSP数字信号处理→Codec DAC→PA→SPK 上行录音: MIC拾音→集成运放→Codec ADC→DSP数字信号处理→CPU Audio Engine 信号处理→App 2.硬件 CPU PCH DSP(可选) Codec PA SPKbox MIC…

Vue 3 中的插槽(Slots)用法

插槽&#xff08;Slots&#xff09;是 Vue 组件中一种非常有用的功能&#xff0c;用于在父组件中向子组件传递内容。Vue 3 引入了 <script setup> 语法&#xff0c;使得组件的写法更加简洁和易读。在本篇博客中&#xff0c;我们将探讨在 Vue 3 中使用插槽的不同方式&…

数据结构与算法基础-学习-27-图之最短路径之Dijkstra(迪杰斯特拉)算法

一、最短路径应用案例 例如从北京到上海旅游&#xff0c;有多条路可以到目的地&#xff0c;哪条路线最短&#xff0c;哪条路线最省钱&#xff0c;就是典型的最短路径问题。 二、最短路径问题分类 最短路径问题可以分为两类&#xff0c;第一类为&#xff1a;两点间最短路径。第…

函数栈帧的创建和毁销【C语言版】

大家好&#xff0c;我是深鱼~ 【前言】前期学习的时候&#xff0c;我们可能有很多的困惑 比如&#xff1a; 局部变量是怎么创建的呢&#xff1f; 为什么局部变量的值是随机值&#xff1f; 函数是怎么传参的&#xff1f;传参的顺序是怎么样的&#xff1f; 形参和实参是什么关系…

上海亚商投顾:沪指放量大涨1.84% 证券股掀涨停潮

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日低开高走&#xff0c;沪指午后放量涨近2%&#xff0c;上证50盘中大涨超3%。大金融板块全线爆发&#…

Wireshark从下载到使用完整教程分享

surfshark如何下载呢&#xff1f;surfshark安卓&#xff0c;苹果以及电脑上使用的完整教程分享可以戳后面地址: https://qptool.net/shark.html Wireshark是一款流行的网络协议分析工具&#xff0c;用于捕获和分析网络数据包。它可以帮助网络管理员和安全专家监视和诊断网络问…

[每日习题]跳石板(动态规划) 手套(贪心)——牛客习题

hello,大家好&#xff0c;这里是bang___bang_&#xff0c;今天来记录2道习题跳石板和手套&#xff01; 目录 1️⃣跳石板 2️⃣手套 1️⃣跳石板 跳石板_牛客题霸_牛客网 (nowcoder.com) 描述 小易来到了一条石板路前&#xff0c;每块石板上从1挨着编号为&#xff1a;1、2、…

批量删除python代码中的注释

ctrlh&#xff0c;调出替换功能窗口 启用正则表达式&#xff0c;输入 (#.*) 点击替换就能删除全部的注释了

【图论】LCA(倍增)

一.LCA介绍 LCA通常指的是“最近共同祖先”&#xff08;Lowest Common Ancestor&#xff09;。LCA是一种用于解决树或图结构中两个节点的最低共同祖先的问题的算法。 在树结构中&#xff0c;LCA是指两个节点的最近层级的共同祖先节点。例如&#xff0c;考虑一棵树&#xff0c;…

16.Netty源码之ChannelPipeline

highlight: arduino-light 服务编排层:ChannelPipeline协调ChannelHandlerHandler EventLoop可以说是 Netty 的调度中心&#xff0c;负责监听多种事件类型&#xff1a;I/O 事件、信号事件、定时事件等&#xff0c;然而实际的业务处理逻辑则是由 ChannelPipeline 中所定义的 Cha…

《Elasticsearch 源码解析与优化实战》第5章:选主流程

《Elasticsearch 源码解析与优化实战》第5章&#xff1a;选主流程 - 墨天轮 一、简介 Discovery 模块负责发现集群中的节点&#xff0c;以及选择主节点。ES 支持多种不同 Discovery 类型选择&#xff0c;内置的实现称为Zen Discovery ,其他的包括公有云平台亚马逊的EC2、谷歌…

C++之普通函数指针/类成员函数指针/lambda回调函数总结(一百六十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

边写代码边学习之卷积神经网络CNN

1. 卷积神经网络CNN 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种深度学习神经网络的架构&#xff0c;主要用于图像识别、图像分类和计算机视觉等任务。它是由多层神经元组成的神经网络&#xff0c;其中包含卷积层、池化层和全连接…

算法与数据结构-二分查找

文章目录 什么是二分查找二分查找的时间复杂度二分查找的代码实现简单实现&#xff1a;不重复有序数组查找目标值变体实现&#xff1a;查找第一个值等于给定值的元素变体实现&#xff1a;查找最后一个值等于给定值的元素变体实现&#xff1a;查找最后一个小于给定值的元素变体实…

【雕爷学编程】MicroPython动手做(10)——零基础学MaixPy之神经网络KPU2

KPU的基础架构 让我们回顾下经典神经网络的基础运算操作&#xff1a; 卷积&#xff08;Convolution&#xff09;:1x1卷积&#xff0c;3x3卷积&#xff0c;5x5及更高的卷积 批归一化&#xff08;Batch Normalization&#xff09; 激活&#xff08;Activate&#xff09; 池化&…

玩一玩编程式 AOP

[toc] 平时我们项目中涉及到 AOP&#xff0c;基本上就是声明式配置一下就行了&#xff0c;无论是基于 XML 的配置还是基于 Java 代码的配置&#xff0c;都是简单配置即可使用。声明式配置有一个好处就是对源代码的侵入小甚至是零侵入。不过今天松哥要和小伙伴们聊一聊编程式的 …

Chapter 9: Lists | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介ListsA list is a sequenceLists are mutableTraversing a listList operationsList slicesList methodsDeleting elementsLists and functionsLists and stringsParsing linesObjects and valuesAliasingList argumentsDebuggingGlossar…

【Spring】Spring 下载及其 jar 包

根据 【动力节点】最新Spring框架教程&#xff0c;全网首套Spring6教程&#xff0c;跟老杜从零学spring入门到高级 以及老杜的原版笔记 https://www.yuque.com/docs/share/866abad4-7106-45e7-afcd-245a733b073f?# 《Spring6》 进行整理&#xff0c; 文档密码&#xff1a;mg9b…

数字签名与数字证书

数字签名与数字证书 数字签名数字证书数字证书的原理数字证书的特点 如何验证证书机构的公钥不是伪造的 数字签名 数字签名是非对称密钥加密技术与数字摘要技术的应用&#xff0c;数字签名就是用加密算法加密报文文本的摘要&#xff08;摘要通过hash函数得到&#xff09;而生成…

「回溯框架」

文章目录 0 回溯和动态规划&#xff08;dp&#xff09;的区别0.1 框架 1 刷题1.1 全排列1.1.1 题解1.1.2 Code1.1.3 结果 1.2 N皇后1.2.1 题解1.2.2 Code1.2.3 结果 0 回溯和动态规划&#xff08;dp&#xff09;的区别 动态规划的核心是穷举&#xff0c;那么回溯算法和dp有什么…