简单工厂模式
2021/12/28 6:08:52
本文主要是介绍简单工厂模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1. 一个小需求
1.1 最原始的需求
- 作为关注教育的人大代表,他需要访问很多处于不同学习阶段的学生,了解他们的学习情况
- 如果使用程序实现的话,就是输入人大代表想访问的学生类型,以打印的方式告知人大代表该类型的学生的学习情况
创建接口
-
聪明的你会想到,不管什么阶段的学生,都有一个打印学习情况的方法
-
因此,你创建了一个Student接口,study() 方法就是打印学生学习情况的方法
public interface Student { void study(); }
实现接口,创建学生类
-
人大代表主要关注的是小学、初中和高中三个阶段的学生
-
因此,你通过实现Student接口,创建了对应的学生类
-
小学生:
public class Pupil implements Student{ @Override public void study() { System.out.println("小学生:我只需要学习语文、数学和英语" ); } }
-
初中生
public class MiddleSchoolStudent implements Student{ @Override public void study() { System.out.println("初中生:初中文理不分科,我需要学习9门课程"); } }
-
高中生
public class HighSchoolStudent implements Student{ @Override public void study() { System.out.println("高中生:我已经文理分科了,只需要学习6门课程"); } }
创建Main类,实现需求
-
不同的学生类已经准备好了,只要人大代表输入学生类型,程序就会根据学生类型创建对应的学生实例
-
然后调用study方法,告知人大代表该学生的学习情况
public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 输入学生类型,获取学生实例 while (true) { String studentType = scanner.next(); Student student = createStudent(studentType); if (student != null) { student.study(); } else { System.out.println("不存在\"" + studentType + "\"这种学生类型"); } } } public static Student createStudent(String studentType) { Student student = null; // 根据学生类型,了解学生的学习情况 if ("小学生".equals(studentType)) { student = new Pupil(); } else if ("初中生".equals(studentType)) { student = new MiddleSchoolStudent(); } else if ("高中生".equals(studentType)) { student = new HighSchoolStudent(); } return student; } }
-
人大代表开始使用程序:
2. 简单工厂模式
2.1 概述
- 其实,根据学生类型、创建对应的学生实例的这个过程,跟工厂生产产品很像
- 一个工厂,它可以生产各种不同类型的产品,买家只需要告诉工厂想要的产品类型,工厂就可以生产出对应的产品
- Student接口就是一个抽象产品,Pupil、MiddleSchoolStudent、HighSchoolStudent就是具体产品,createStudent()方法就是一个工厂
- 整个分析下来,简单工厂模式的UML图如下:
2.2 改写程序,实现简单工厂模式
-
将Main类的createStudent() 方法提取出来,创建一个工厂类
-
工厂方法一般都是静态方法,只需通过类名即可访问对应的工厂方法
public class StudentFactory { public static Student createStudent(String studentType) { // 根据学生类型,了解学生的学习情况 if ("小学生".equals(studentType)) { return new Pupil(); } else if ("初中生".equals(studentType)) { return new MiddleSchoolStudent(); } else if ("高中生".equals(studentType)) { return new HighSchoolStudent(); } // 尚未支持的学生类型 System.out.println("尚不支持\"" + studentType + "\"这种学生类型"); return null; } }
-
在Main类的main方法中,通过工厂创建对应的学生实例
public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 输入学生类型,获取学生实例 String studentType = scanner.next(); Student student = StudentFactory.createStudent(studentType); if (student != null) { student.study(); } } }
2.3 简单工厂模式的优缺点
优点
- 调用者想要创建一个对象,只需要知道其名称即可,而无需记忆复杂的类名
- 工厂模式屏蔽了对象的创建过程,调用者只需要关心对象的接口(方法)
缺点
- 难扩展:每次增加一种类型的产品,都需要增加一个具体的实现类,并修改工厂方法以支持该产品的创建
- 难维护:一旦产品类型过多,需要撰写很长的
if-else
语句,不利于代码维护
2.4 自己的理解
- 与其说这是一种设计模式,不如说这是一种编程习惯
- 对于调用者来说,他不想去记忆复杂的类名,也不想自己实现对象的创建逻辑
- 他只想传入一个约定好的暗号,就获得一个现成的对象
- 然后,他就可以直接调用对象的方法去执行某些操作
- 这时,为了满足他的需求,工厂方法就应运而生
- 最终,被一些善于观察的高人总结为简单工厂模式
这篇关于简单工厂模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现
- 2024-05-30我们小公司,哪像华为一样,用得上IPD(集成产品开发)?
- 2024-05-30java excel上传--poi
- 2024-05-30安装笔记本应用商店的pycharm,再安排pandas等模块,说是没有打包工具?
- 2024-05-29java11新特性
- 2024-05-29哪些无用敏捷指标正在破坏敏捷转型?
- 2024-05-29鸿蒙原生应用再新丁!新华社 入局鸿蒙
- 2024-05-29设计模式 之 迭代器模式(Iterator)