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

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

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

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

在这里插入图片描述

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

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

简单工厂模式的实现方式

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

1. 创建产品接口

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

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

2. 创建产品实现类

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

// 具体产品实现类A
public class ConcreteProductA implements Product {@Overridepublic void operate() {System.out.println("Product A is operating.");}
}// 具体产品实现类B
public class ConcreteProductB implements Product {@Overridepublic 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.mzph.cn/news/12721.shtml

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

相关文章

JMM的特征:可见性,有序性,原子性

1.volatile关键字(保证可见性、有序性) volatile关键字可以有效的保证可见性和有序性。一旦一个共享变量被volatile修饰后,保证了线程在工作内存中对变量进行操作的可见性,一个线程修改了其值,对其他线程来说是立即可见的。而且禁止对程序的…

【无标题】深圳卫视专访行云创新马洪喜:拥抱AI与云原生,深耕云智一体化创新

人工智能(AI)是引领新一轮科技革命和产业变革的重要驱动力。因此,深圳出台相关行动方案,统筹设立规模1,000亿元的人工智能基金群,引导产业集聚培育企业梯队,积极打造国家新一代人工智能创新发展试验区和国家…

【高压架构】AP5199S LED平均电流型恒流驱动IC 0.01调光 景观舞台汽车灯驱动照明

说明 AP5199S 是一款外围电路简单的多功能平均电流型 LED 恒流驱动器,适用于宽电压范围的非隔离式大功率恒流 LED 驱动领域。芯片 PWM 端口支持超小占空比的 PWM 调光,可响应 60ns 脉宽。为客户提供解决方案,限度地发挥灯具优势,…

解锁ChatGPT的潜能:API调用中运用聊天记录

在过去我通过chatgpt调用api时只知道进行孤立的调用,即这一次调用时,chatgpt并没有拿到上一次调用的上下文,这无疑损失很大。通过探索,我知道了如何通过修改messages这个字典类型的list来告知chatgpt我和它的聊天历史。 关键代码…

shell中按照特定字符分割字符串,并且在切分后的每段内容后加上特定字符(串),然后再用特定字符拼接起来

文件中的内容&#xff0c;可以这么写&#xff1a; awk -F, -v OFS, {for(i1;i<‌NF;i){$i$i"_suffix"}}1 input.txt-F,&#xff1a;设置输入字段分隔符为逗号&#xff08;,&#xff09;&#xff0c;这将使awk按照逗号分割输入文本。-v OFS‘,’&#xff1a;设置输…

【Golang】Golang进阶系列教程--为什么 Go 不支持 []T 转换为 []interface

文章目录 前言官方解释内存布局程序运行中的内存布局通用方法 前言 在 Go 中&#xff0c;如果 interface{} 作为函数参数的话&#xff0c;是可以传任意参数的&#xff0c;然后通过类型断言来转换。 举个例子&#xff1a; package mainimport "fmt"func foo(v inter…

python 面向对象编程的特点 - 封装 - 继承(经典类、新式类) - 多态 - 静态方法、类方法 - 下划线的使用 - 回合制攻击游戏实验

目录 面向对象编程的特点&#xff1a; 封装&#xff1a;封装是将数据和操作&#xff08;方法&#xff09;封装在一个对象中的能力 继承&#xff1a;继承是指一个类&#xff08;子类&#xff09;可以继承另一个类&#xff08;父类&#xff09;的属性和方法。 我们为什么需要继…

HashMap中hash方法的作用(详解)

首先&#xff0c;hash方法用来干什么&#xff1f; 在搞清楚原理之前&#xff0c;我们先站在巨人的肩膀浅浅了解一下hash方法的本质作用。 实质上&#xff0c;它的作用很朴素&#xff0c;就是用key值通过某种方式计算出一个hash码 而且这个hash码我们后面要用来计算key存在底…

golangd\pycharm-ai免费代码助手安装使用gpt4-免费使用--[推荐]

golangd-ai免费代码助手安装使用,pycharm可以使用&#xff0c;估计只要是xx的ide都是可以使用这个插件 目前GPT4以及gpt的大规模使用&#xff0c;如何快速掌握以及在ide中快速使用的办法&#xff0c;今天安装一款golangd编辑器的插件已经使用 一、安装以及使用 1.在golangd中…

贼全! 一举通关的 Spring+SpringBoot+SpringCloud 全攻略, 是真香啊

前几天&#xff0c;有幸从朋友那里得到了一份 Alibaba 内部的墙裂推荐的“玩转 Spring 全家桶的 PDF”&#xff0c;我也不是个吝啬的人&#xff0c;好的东西当然要一起分享。那今天我就秀一把&#xff0c;带你一站通关 Spring、Spring Boot 与 Spring Cloud,让你轻松斩获大厂 O…

安全基础 --- 正则表达式

正则表达式是表达文本模式的方法 正则表达式&#xff08;Regular Expression&#xff09;&#xff0c;简称为正则或Regex&#xff0c;是一个用来描述、匹配和操作字符串的工具。 &#xff08;1&#xff09;限定字符 限定字符多用于重复匹配次数 常用限定字符&#xff1a; 语…

Statefulset部署应用

上一部分我们分享到了使用 RS 没有办法让自己管理的多个 pod 都有一个独立的持久化声明&#xff0c;RS 没有办法在指定模板中对不同的 pod 做差异化处理 使用多个 RS 来分别管理自己的的一个 pod&#xff0c;当我们扩缩容的时候&#xff0c;也会出现问题&#xff0c;老的 pod …

C# 关于使用newlife包将webapi接口寄宿于一个控制台程序、winform程序、wpf程序运行

C# 关于使用newlife包将webapi接口寄宿于一个控制台程序、winform程序、wpf程序运行 安装newlife包 Program的Main()函数源码 using ConsoleApp3; using NewLife.Log;var server new NewLife.Http.HttpServer {Port 8080,Log XTrace.Log,SessionLog XTrace.Log }; serv…

Python 抽象工厂模式介绍、使用

一、抽象工厂模式介绍 概念&#xff1a; Python 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的方式&#xff0c;用于创建一系列相关或相互依赖的对象。它为客户端提供了一种创建对象的接口&#xff…

【微服务架构设计】微服务不是魔术:处理超时

微服务很重要。它们可以为我们的架构和团队带来一些相当大的胜利&#xff0c;但微服务也有很多成本。随着微服务、无服务器和其他分布式系统架构在行业中变得更加普遍&#xff0c;我们将它们的问题和解决它们的策略内化是至关重要的。在本文中&#xff0c;我们将研究网络边界可…

使用贝叶斯算法完成文档分类问题

贝叶斯原理 贝叶斯原理&#xff08;Bayes theorem&#xff09;是一种用于计算条件概率的数学公式。它是以18世纪英国数学家托马斯贝叶斯&#xff08;Thomas Bayes&#xff09;的名字命名的。贝叶斯原理表达了在已知某个事件发生的情况下&#xff0c;另一个事件发生的概率。具体…

二十三种设计模式第十七篇--迭代子模式

迭代子模式是一种行为型设计模式&#xff0c;它允许你按照特定方式访问一个集合对象的元素&#xff0c;而又不暴露该对象的内部结构。迭代子模式提供了一种统一的方式来遍历容器中的元素&#xff0c;而不需要关心容器的底层实现。 该模式包含以下几个关键角色&#xff1a; 迭…

计算机网络(1) --- 网络介绍

目录 1.介绍协议 基础知识 协议 协议分层 OSI七层模型 2.TCP/IP五层模型 3.网络传输的基本流程 1.基本知识 协议报头 2.局域网通信的基本流程 3.网络传输流程 局域网分类 跨路由器传输 数据包封装和分用 4.网络中的地址管理 1.IP地址 2.MAC地址 3.区别 1.介绍…

Linux/Windows路由管理

本文主要介绍如果通过linux/Windows命令添加IPV6地址&#xff0c;查看添加IPV6默认路由&#xff0c;查看IPV6邻居缓存 一、Linux 1、查看地址 IPV4: route netstat -route ip route IPV6: ip -6 route show route -A inet6 route -62、添加IPV6地址 ip -6 addr add <…

训练自己的行文本检测EAST模型

训练自己的行文本检测EAST模型 训练数据格式 训练数据格式