当前位置: 首页 > news >正文

1. 设计模式--工厂方法模式

一. 工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,它提供了一种创建对象的方式,使得创建对象的过程与使用对象的过程分离。

工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。

二. 简单工厂模式

1.首先定义一个接口

public interface Course {void make();
}

2.创建实现接口的两个实体类JavaCourse和PythonCourse

public class JavaCourse implements Course {@Overridepublic void make() {System.out.println("制作Java课程");}
}
public class PythonCourse implements Course {@Overridepublic void make() {System.out.println("制作Python课程");}
}

3.创建一个工厂,根据传入的参数生成对应的实体

public class SimpleCourseFactory {public Course getCourse(String course) {if (course.equalsIgnoreCase("java")) {return new JavaCourse();} else if (course.equalsIgnoreCase("python")) {return new PythonCourse();}return null;}
}

4.测试

public class Main {public static void main(String[] args) {SimpleCourseFactory courseFactory = new SimpleCourseFactory();Course course1 = courseFactory.getCourse("java");course1.make();Course course2 = courseFactory.getCourse("python");course2.make();}
}

运行结果:

制作Java课程
制作Python课程

5.存在的问题
当前Course对象的创建逻辑全在SimpleCourseFactory类getCourse方法中,如果需要新增一种新的Course对象,则需要修改getCourse方法。这违背了软件设计中的"开闭原则"。

三. 工厂方法模式

基于简单工厂模式中存在的问题,可以将对象的创建抽象出一个独立的接口,不同的对象实现不同的工厂类。

1.创建工厂类接口

public interface CourseFactory {Course getCourse();
}

2.实现两个实体类所对应的工厂类

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

3.测试

public class Main {public static void main(String[] args) {CourseFactory courseFactory = new JavaCourseFactory();Course course = courseFactory.getCourse();course.make();courseFactory = new PythonCourseFactory();course = courseFactory.getCourse();course.make();}
}

运行结果:

制作Java课程
制作Python课程

四. 总结

适用场景:创建同一种对象时需要将对象的创建与使用解耦开时可以使用工厂方法模式。

http://www.dtcms.com/a/395880.html

相关文章:

  • SpringBoot常用配置
  • 【论文阅读】π0:用于通用机器人控制的视觉-语言-动作流模型
  • Spring 框架学习指南
  • Vue3 父子组件通信实战:props 与 provide/inject 方案对比及用法解析
  • el-image标签预览和VForm打包后项目上层级冲突问题
  • QML学习笔记(九)QML的全局对象
  • element里的select自定义输入的时候,不用点击下拉框选中自定义输入,而是当焦点失去的时候自动赋值输入的内容
  • 链改2.0+港促会,携手赋能 Web3引企赴港!
  • C++第二篇:命名空间(namespace)
  • vcsa 重启服务
  • QT 两种库写法 LIBS += .a和LIBS += -L -l
  • 比斯特自动化|电动自行车电池点焊机的作用与使用
  • Django 模型与 ORM 全解析(一):从基础到实战的完整指南
  • NW955NW960美光固态闪存NW963NW971
  • iOS 26 软件兼容性大检查,哪些 App 出问题、API 变动要注意、旧功能不支持兼容性测试全流程
  • HarmonyOS NEXT互动卡片开发:从原理到实战的完整指南
  • 邪修实战系列(6)
  • Clover: 1靶场渗透
  • 智慧供水管网监测解决方案:实现压力、流量、水质数据集与监控
  • 深入理解Java虚拟机内存模型
  • 什么是缺陷检测?机器视觉表面缺陷检测从定义到实战方法,避开漏判误判
  • Svelte:编译时优化原理、与传统虚拟DOM框架的性能对比性能优化
  • 属性描述符
  • JavaWeb之JSP 快递管理与过滤器详解
  • 《MedChat智能医疗问答系统》项目介绍
  • 使用FastAPI和Docker部署机器学习模型:从开发到生产的最佳实践
  • Per-Tensor 量化和Per-Channel 量化
  • 执行bat任务栏有图标显示,执行pycharm64.exe就没有是什么原因
  • 【Docker项目实战】使用Docker部署wealth-tracker个人资产分析工具
  • LeapMotion_Demo演示