【精选】设计模式——工厂设计模式

工厂设计模式是一种创建型设计模式,其主要目的是通过将对象的创建过程封装在一个工厂类中来实现对象的创建。这样可以降低客户端与具体产品类之间的耦合度,也便于代码的扩展和维护。
在这里插入图片描述
在这里插入图片描述

工厂设计模式:

以下是Java中两个常见的工厂设计模式示例:
在这里插入图片描述

1. 简单工厂模式

在这里插入图片描述

简单工厂模式又称静态工厂模式,通过一个工厂类统一创建各种不同类型的产品对象。下面以创建不同形状的图形为例。

// 定义图形接口
interface Shape {void draw();
}// 实现具体图形类
class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a circle.");}
}class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a rectangle.");}
}class Triangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a triangle.");}
}// 简单工厂类
class ShapeFactory {// 根据传入参数创建对应的图形对象public static Shape createShape(String shapeType) {if (shapeType.equalsIgnoreCase("circle")) {return new Circle();} else if (shapeType.equalsIgnoreCase("rectangle")) {return new Rectangle();} else if (shapeType.equalsIgnoreCase("triangle")) {return new Triangle();}return null;}
}// 使用示例
public class SimpleFactoryExample {public static void main(String[] args) {Shape circle = ShapeFactory.createShape("circle");circle.draw(); // 输出:Drawing a circle.Shape rectangle = ShapeFactory.createShape("rectangle");rectangle.draw(); // 输出:Drawing a rectangle.Shape triangle = ShapeFactory.createShape("triangle");triangle.draw(); // 输出:Drawing a triangle.}
}

2. 工厂方法模式

工厂方法模式定义了一个创建对象的接口,但具体由子类决定实例化哪个类。下面以创建不同类型的日志记录器为例。

// 定义日志记录器接口
interface Logger {void log(String message);
}// 实现具体日志记录器类
class FileLogger implements Logger {@Overridepublic void log(String message) {System.out.println("Writing log to file: " + message);}
}class ConsoleLogger implements Logger {@Overridepublic void log(String message) {System.out.println("Writing log to console: " + message);}
}// 抽象工厂类
abstract class LoggerFactory {// 创建日志记录器对象public abstract Logger createLogger();
}// 具体工厂类,用于创建文件日志记录器
class FileLoggerFactory extends LoggerFactory {@Overridepublic Logger createLogger() {return new FileLogger();}
}// 具体工厂类,用于创建控制台日志记录器
class ConsoleLoggerFactory extends LoggerFactory {@Overridepublic Logger createLogger() {return new ConsoleLogger();}
}// 使用示例
public class FactoryMethodExample {public static void main(String[] args) {LoggerFactory fileLoggerFactory = new FileLoggerFactory();Logger fileLogger = fileLoggerFactory.createLogger();fileLogger.log("Error occurred."); // 输出:Writing log to file: Error occurred.LoggerFactory consoleLoggerFactory = new ConsoleLoggerFactory();Logger consoleLogger = consoleLoggerFactory.createLogger();consoleLogger.log("Warning."); // 输出:Writing log to console: Warning.}
}

好的,下面继续介绍另外两个常见的工厂设计模式示例:

3. 抽象工厂模式

抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。下面以创建不同操作系统的界面组件为例。

// 定义操作系统界面组件接口
interface Button {void render();
}interface TextField {void render();
}// 实现Windows操作系统界面组件
class WindowsButton implements Button {@Overridepublic void render() {System.out.println("Rendering a Windows button.");}
}class WindowsTextField implements TextField {@Overridepublic void render() {System.out.println("Rendering a Windows text field.");}
}// 实现Mac操作系统界面组件
class MacButton implements Button {@Overridepublic void render() {System.out.println("Rendering a Mac button.");}
}class MacTextField implements TextField {@Overridepublic void render() {System.out.println("Rendering a Mac text field.");}
}// 抽象工厂接口
interface GUIFactory {Button createButton();TextField createTextField();
}// 具体工厂类,用于创建Windows风格的界面组件
class WindowsGUIFactory implements GUIFactory {@Overridepublic Button createButton() {return new WindowsButton();}@Overridepublic TextField createTextField() {return new WindowsTextField();}
}// 具体工厂类,用于创建Mac风格的界面组件
class MacGUIFactory implements GUIFactory {@Overridepublic Button createButton() {return new MacButton();}@Overridepublic TextField createTextField() {return new MacTextField();}
}// 使用示例
public class AbstractFactoryExample {public static void main(String[] args) {// 创建Windows风格的界面组件GUIFactory windowsFactory = new WindowsGUIFactory();Button windowsButton = windowsFactory.createButton();windowsButton.render(); // 输出:Rendering a Windows button.TextField windowsTextField = windowsFactory.createTextField();windowsTextField.render(); // 输出:Rendering a Windows text field.// 创建Mac风格的界面组件GUIFactory macFactory = new MacGUIFactory();Button macButton = macFactory.createButton();macButton.render(); // 输出:Rendering a Mac button.TextField macTextField = macFactory.createTextField();macTextField.render(); // 输出:Rendering a Mac text field.}
}

抽象工厂模式可以创建一系列相关的产品对象,例如上述示例中的不同操作系统的界面组件。使用此模式可以确保所创建的产品对象是相互配套的。

4. 单例工厂模式

单例工厂模式通过工厂类控制只创建一个对象实例,供客户端使用。下面以创建数据库连接对象为例。

// 数据库连接类
class DBConnection {private static DBConnection instance;// 私有构造函数,防止通过new关键字创建实例private DBConnection() {}public static synchronized DBConnection getInstance() {if (instance == null) {instance = new DBConnection();}return instance;}public void connect() {System.out.println("Connecting to the database...");}
}// 使用示例
public class SingletonFactoryExample {public static void main(String[] args) {DBConnection connection1 = DBConnection.getInstance();connection1.connect(); // 输出:Connecting to the database...DBConnection connection2 = DBConnection.getInstance();connection2.connect(); // 输出:Connecting to the database...System.out.println(connection1 == connection2); // 输出:true,表示只创建了一个实例}
}

单例工厂模式确保在整个应用程序中只有一个实例被创建和共享,避免了多次创建相同对象的开销,并且能够提供全局访问点以便于其他对象使用。

工厂设计模式具有以下优点:

  1. 解耦客户端和具体产品类:工厂类负责对象的创建,客户端只需要通过工厂类获取所需的对象,无需直接与具体产品类交互,从而降低了客户端与具体产品类之间的耦合度。
  2. 代码的扩展性和维护性好:当需要增加新的产品时,只需添加相应的产品类和对应的工厂方法即可,不需要修改已有的代码,符合开闭原则(对扩展开放,对修改关闭)。
  3. 更好地封装和隐藏了对象的创建过程:客户端无需关心对象的创建细节,只需调用工厂类的方法即可得到所需的对象。
  4. 提高了程序的可扩展性:通过工厂类统一创建对象,可以方便地切换产品系列或者替换具体的工厂类,符合依赖倒置原则。

然而,工厂设计模式也存在一些缺点:

  1. 增加了系统的复杂度:引入工厂类会增加系统的类和对象数量,增加了代码量和理解难度。
  2. 不够灵活:由于工厂类负责对象的创建,如果需要创建具有不同特性的对象,可能需要修改工厂类的代码,违反了开闭原则。
  3. 难以扩展新的产品族:当需要扩展一个新的产品族时,需要修改工厂类的代码,违反了开闭原则。

因此,在使用工厂设计模式时需要根据实际情况权衡其优缺点,并选择最适合的设计方案。

除了上述列举的几种工厂设计模式,还有一些其他的变体和衍生形式:

  1. 多个工厂方法:某些情况下,可以在抽象工厂类中定义多个工厂方法,每个工厂方法分别用于创建不同类型的产品对象。这样可以更加灵活地处理不同类型的产品。
  2. 延迟初始化工厂:在工厂类中使用延迟初始化技术,只有在需要时才创建具体产品对象。这样可以节省系统资源,提高性能。
  3. 反射工厂:通过Java反射机制,根据传入的类名动态创建对象。这种方式可以在运行时动态地创建对象,灵活性更高。
  4. 简单工厂与抽象工厂结合:有时候可以将简单工厂和抽象工厂结合使用,以实现更复杂的对象创建过程。例如,在抽象工厂中定义一个工厂方法来创建简单工厂,然后再由简单工厂负责创建具体产品对象。

无论是哪种工厂设计模式,都要根据实际需求选择合适的方案。工厂设计模式在许多软件系统中都得到了广泛应用,它们能够提供良好的代码结构、可扩展性和灵活性,使得系统更易于维护和拓展。

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

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

相关文章

【数据结构 — 排序 — 插入排序】

数据结构 — 排序 — 插入排序 一.排序1.1.排序的概念及其运用1.1.1排序的概念1.1.2排序运用1.1.3 常见的排序算法 二.插入排序2.1.直接插入排序2.1.1.算法讲解2.1.2.代码实现2.1.2.1.函数定义2.1.2.2.算法接口实现2.1.2.3.测试代码实现2.1.2.4.测试展示 2.2.希尔排序2.2.1.算法…

vue路由导航守卫(全局守卫、路由独享守卫、组件内守卫)

目录 一、什么是Vue路由导航守卫? 二、全局守卫 1、beforeEach 下面是一个beforeEach的示例代码: 2、beforeResolve 下面是一个beforeResolve的示例代码: 3、afterEach 下面是一个afterEach的示例代码: 三、路由独享守卫…

scikit-learn实现线性回归

要学习scikit-learn,我们必须要到scikit-clearn的官网中去查看公式和原理 scikit-learn 官网 scikit-learn 中文社区 进入官网一以后我们找到回归,然后再有监督学习中找到线性模型 scikit-learn实现简单的线性回归 公式: L2范数是指向量中每个元素的平…

NLP项目实战01之电影评论分类

介绍: 欢迎来到本篇文章!在这里,我们将探讨一个常见而重要的自然语言处理任务——文本分类。具体而言,我们将关注情感分析任务,即通过分析电影评论的情感来判断评论是正面的、负面的。 展示: 训练展示如下…

软件设计中如何画各类图之八深入解析部署图:物理布局与系统架构的视觉化呈现

目录 1 前言2 部署图的符号及说明3 画部署图的步骤3.1 **识别节点**3.2 **定义组件**3.3 **标识部署关系**3.4 **添加细节** 4 部署图的用途4.1 **系统设计与规划**4.2 **系统架构分析**4.3 **系统维护与升级** 5 实际场景举例5.1 Web应用部署图5.2 云端服务部署图 6 结语 1 前…

【GAMES101】观测变换

图形学不等于 OpenGL,不等于光线追踪,而是一套生成整个虚拟世界的方法 记得有个概念叫光栅化,就是把三维虚拟世界的事物显示在二维的屏幕上,这里就涉及到观察变换 观察变换,叫viewing transformation,包括…

二分查找|前缀和|滑动窗口|2302:统计得分小于 K 的子数组数目

作者推荐 贪心算法LeetCode2071:你可以安排的最多任务数目 本文涉及的基础知识点 二分查找算法合集 题目 一个数组的 分数 定义为数组之和 乘以 数组的长度。 比方说,[1, 2, 3, 4, 5] 的分数为 (1 2 3 4 5) * 5 75 。 给你一个正整数数组 nums 和一个整数…

【带头学C++】----- 九、类和对象 ---- 9.10 C++设计模式之单例模式设计

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️麻烦您点个关注,不迷路❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️ 目 录 9.10 C设计模式之单例模式设计 举例说明: 9.10 C设计模式之单例模式设计 看过我之前的文章的,简单讲解过C/Q…

Python:核心知识点整理大全8-笔记

目录 ​编辑 4.5 元组 4.5.1 定义元组 dimensions.py 4.5.2 遍历元组中的所有值 4.5.3 修改元组变量 4.6 设置代码格式 4.6.1 格式设置指南 4.6.2 缩进 4.6.3 行长 4.6.4 空行 4.6.5 其他格式设置指南 4.7 小结 第5章 if语句 5.1 一个简单示例 cars.py 5.2 条…

Kafka快速实战以及基本原理详解

文章目录 一、Kafka介绍为什么要用Kafka 二、Kafka快速上手实验环境单机服务体验 三、理解Kakfa的消息传递机制四、Kafka集群服务五、理解服务端的Topic、Partition和Broker七、Kafka集群的整体结构八、Kraft集群Kraft集群简介配置Kraft集群 一、Kafka介绍 ChatGPT对于Apache …

探索HarmonyOS开发—Slider滑动条组件

Slider Slider 滑块组件 Slider({min: 0, // 最小值max: 350, // 最大值value: 30, // 当前值step:10, // 滑动步长style:SliderStyle.OutSet, // Inset 滑块的位置direction:Axis.Horizontal, // Verticalreverse:false // 是否反向滑动 }) style属性可以控制滑块在整个滑块…

元宇宙vr党建云上实景展馆扩大党的影响力

随着科技的飞速发展,VR虚拟现实技术已经逐渐融入我们的日常生活,尤其在党建领域,VR数字党建展馆更是成为引领红色教育新风尚的重要载体。今天,就让我们一起探讨VR数字党建展馆如何提供沉浸式体验,助力党建工作创新升级…