23种设计模式之工厂方法模式

ops/2024/10/24 8:55:39/

文章目录

  • 1. 简介
  • 2. 代码
    • 2.1 抽象类:Course.java
    • 2.2 产品A:JavaCourse.java
    • 2.3 产品B:PythonCourse.java
    • 2.4 工厂抽象类:CourseFactory.java
    • 2.5 产品A的工厂A:JavaCourseFactory.java
    • 2.6 产品B的工厂B:PyCourseFactory.java
    • 2.7 测试:Test.java
  • 3. 总结
  • 4. 参考链接(无)

1. 简介

工厂模式是简单工厂模式的延伸,符合开闭原则的基础上,还可以在增加新的具体产品对象时不需要对已有系统做任何修改。
定义一个接口或一个抽象的工厂类,让它实现(工厂)来创建哪一个实例对象。

根据每个工厂不同的方法,来产生不同的所需要的对象。

  1. 解耦。把对象的创建和使用的过程分开。就是Class A 想调用 Class B,那么A只是调用B的方法,不需要管B的实例化或者不感知B如何实例化,创建的工作交给工厂类。
  2. 代码复用。如果创建对象B的过程需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。把创建对象B的代码放到工厂里统一管理。既减少重复代码,也方便以后对B的创建过程的修改和维护
  3. 符合迪米特法则和单一职责,使用者只需要知道如何使用以及负责如何用,无须感知创建的逻辑。

缺点

  • 添加新产品会增加具体工厂类和具体产品类,这无疑会增加系统的复杂度,带来更多的开销。。。

在这里插入图片描述

2. 代码

2.1 抽象类:Course.java

public abstract class Course{public abstract void make();
}

2.2 产品A:JavaCourse.java

public class JavaCourse extends Course {@Overridepublic void make() {System.out.println("制作java课程");}
}

2.3 产品B:PythonCourse.java

public class PythonCourse extends Course{@Overridepublic void make() {System.out.println("制作python课程");}
}

2.4 工厂抽象类:CourseFactory.java

public abstract class CourseFactory {public abstract Course getCourse();
}

2.5 产品A的工厂A:JavaCourseFactory.java

public class JavaCourseFactory extends CourseFactory {@Overridepublic Course getCourse() {return new JavaCourse();}
}

2.6 产品B的工厂B:PyCourseFactory.java

public class PyCourseFactory extends CourseFactory {@Overridepublic Course getCourse() {return new PythonCourse();}
}

2.7 测试:Test.java


public class Test {public static void main(String[] args) {JavaCourseFactory javaFactory = new JavaCourseFactory();Course javaCourse = javaFactory.getCourse();javaCourse.make();PyCourseFactory pythonFactory = new PyCourseFactory();Course pythonCourse = pythonFactory.getCourse();pythonCourse.make();}
}

运行结果:

制作java课程
制作python课程

3. 总结

BeanFactory就是使用的这个模式,org.springframework.beans.factory.BeanFactory(version:5.0.5)
这里就不进行更多说明了,想知道更多,自己去看源码。

4. 参考链接(无)


http://www.ppmy.cn/ops/128046.html

相关文章

rust grpc demo

文章目录 1. 创建项目2. 配置proto2.1 配置Cargo.toml, 内容如下:2.2 创建文件proto/hello.proto, 内容如下:2.3 添加build.rs文件, 内容如下:2.4 项目结构如下:2.5 编译proto文件 3.0 处理服务3.1 项目引入3.2 添加sr…

学习记录:js算法(七十三):跳跃游戏

文章目录 跳跃游戏思路一:贪心算法思路二:动态规划思路三:递归 记忆化搜索思路四:广度优先搜索 (BFS)思路五:深度优先搜索 (DFS) 跳跃游戏 给你一个非负整数数组 nums ,你最初位于数组的 第一个 下标 。数…

我开源了Go语言连接数据库和一键生成结构体的包【实用】

项目地址:https://gitee.com/zht639/my_gopkg autosql autosql 是一个简化数据库使用的模块,支持常见的数据库(MySQL、PostgreSQL、SQLite、SQL Server)。该模块不仅提供了数据库连接函数,还能自动生成数据表对应的结…

如何解决 PyQt5 中使用 QtNetwork后使用pyinstaller 打包后网络请求失败的问题

在使用 PyQt5 开发应用程序时,我遇到一个问题:使用 QtNetwork 进行网络通信,在通过 PyInstaller 打包后,应用程序无法正常进行网络请求。经过一些研究和尝试,我找到了解决方案,并记录如下: 问题…

图文深入介绍oracle资源管理(续)

1. 引言: 本文将承接上篇继续深入介绍oracle资源管理。本文重点介绍如何使用oracle资源管理器管理好DB。 2. 资源管理器: 可以使用图形界面 OEM$或命令行调用 DBMS RESOURCE MANAGER 程序包的过程进行数据库资源管理。 调用资源管理器的先决条件&…

Linux中如何理解一切皆文件

根据之前的学习我们会有一些少许的疑惑,我们的stdin ,stdout,stderr访问的是键盘显示器,然而键盘显示器等他们都有一个共同的特点就是他们都是外设,那么这些外设是怎么被看成是文件的呢? 看图可以知道硬件的…

TCP 协议学习

一、引言 在当今的网络通信世界中,TCP(Transmission Control Protocol,传输控制协议)是最为重要的协议之一。它为各种网络应用提供了可靠的、有序的数据传输服务,是互联网通信的基石。无论是网页浏览、电子邮件发送、…

万户ezEIP企业管理系统 productlist.aspx SQL注入漏洞复现

0x01 产品描述: 万户协同办公平台 ezEIP 是一个综合信息基础应用平台。系统完善的用户、权限、角色、对象多层分离权限管理体系,实现分站点、分栏目、分对象的分权管理体系,将站点维护工作分担到各职能部门各岗位。系统管理员负责系统基础设置…