IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 简单工厂模式 -> 正文阅读

[Java知识库]简单工厂模式

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 简单工厂模式的优缺点

优点

  1. 调用者想要创建一个对象,只需要知道其名称即可,而无需记忆复杂的类名
  2. 工厂模式屏蔽了对象的创建过程,调用者只需要关心对象的接口(方法)

缺点

  1. 难扩展:每次增加一种类型的产品,都需要增加一个具体的实现类,并修改工厂方法以支持该产品的创建
  2. 难维护:一旦产品类型过多,需要撰写很长的if-else语句,不利于代码维护

2.4 自己的理解

  • 与其说这是一种设计模式,不如说这是一种编程习惯
  • 对于调用者来说,他不想去记忆复杂的类名,也不想自己实现对象的创建逻辑
  • 他只想传入一个约定好的暗号,就获得一个现成的对象
  • 然后,他就可以直接调用对象的方法去执行某些操作
  • 这时,为了满足他的需求,工厂方法就应运而生
  • 最终,被一些善于观察的高人总结为简单工厂模式 😂

参考链接:

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-28 22:46:11  更:2021-12-28 22:46:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:01:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码