创建接口
聪明的你会想到,不管什么阶段的学生,都有一个打印学习情况的方法
因此,你创建了一个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; } }
人大代表开始使用程序:
将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(); } } }
优点
缺点
if-else
语句,不利于代码维护