第十天,学习一下工厂模式
18周 JAVA从入门到入土
一、多态/反射/工厂模式
当父类的引用指向子类的对象时,该对象中的方法是子类中的方法,这就是多态。反射是指根据类名字符串来制造对象。将两者结合起来,就可以做到通过改变字符串来将整个程序从一个子类的方法转换为另一个子类的方法。工厂模式就是制造一个工厂类,从配置文件中读取信息来创建特定的子类对象,以完成对程序中方法的切换。
1.1 使用
public interface 接口名 {
public void 抽象方法();
}
public class 实现类1 implements 接口 {
@Override
public void 抽象方法() {
重写方法-实现类1;
}
}
public class 实现类2 implements 接口 {
@Override
public void 抽象方法() {
重写方法-实现类2;
}
}
import java.io.BufferedReader;
import java.io.FileReader;
public class 工厂类 {
public 接口名 实现类对象获取方法() {
String row = "";
try {
BufferedReader input = new BufferedReader(new FileReader("路径"));
row = input.readLine();
input.close();
return (接口名) Class.forName(row).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
public class 测试类 {
public static void main(String[] args) {
工厂类 工厂变量名 = new 工厂类();
接口类 接口变量名 = 工厂变量名.实现类对象获取方法();
接口变量名.抽象方法();
}
}
1.2 练习
改进员工管理界面,使其可以在内存数据处理和文本数据处理间自由切换:
public class Employee {
private int id;
private String name;
private String sex;
private int age;
private String department;
public Employee(int id, String name, String sex, int age, String department) {
super();
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
this.department = department;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getSex() {
return sex;
}
public int getAge() {
return age;
}
public String getDepartment() {
return department;
}
@Override
public String toString() {
return id + "号" + sex + "员工 " + name + " , " + age + "岁在 " + department + " 工作";
}
}
import java.util.List;
public interface EmployeeDao {
public List<Employee> getEmployeeList();
public void showEmployeeList();
public Employee searchEmployeeByID(int id);
public void addEmployee(String name, String sex, int age, String department);
public void removeEmployeeByID(int id);
public int getNextID();
}
import java.util.Iterator;
import java.util.List;
public class EmployeeDaoFakeImpl implements EmployeeDao {
@Override
public List<Employee> getEmployeeList() {
return FakeData.employeeList;
}
@Override
public void showEmployeeList() {
FakeData.employeeList.forEach(System.out::println);
}
@Override
public Employee searchEmployeeByID(int id) {
for (Employee emp : FakeData.employeeList) {
if (emp.getId() == id) {
return emp;
}
}
return null;
}
@Override
public void addEmployee(String name, String sex, int age, String department) {
int id = getNextID();
FakeData.employeeList.add(new Employee(id, name, sex, age, department));
}
@Override
public void removeEmployeeByID(int id) {
Iterator<Employee> ite = FakeData.employeeList.iterator();
while (ite.hasNext()) {
if (ite.next().getId() == id) {
ite.remove();
}
}
}
@Override
public int getNextID() {
int maxID = 0;
for (Employee emp : FakeData.employeeList) {
if (emp.getId() > maxID) {
maxID = emp.getId();
}
}
return maxID + 1;
}
}
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class EmployeeDaoFileImpl implements EmployeeDao {
@Override
public List<Employee> getEmployeeList() {
List<Employee> list = new ArrayList<Employee>();
try {
BufferedReader input = new BufferedReader(new FileReader("resource/Employee/EmployeeData"));
String row = "";
while ((row = input.readLine()) != null) {
list.add(new Employee(Integer.parseInt(row.split("-")[0]), row.split("-")[1], row.split("-")[2],
Integer.parseInt(row.split("-")[3]), row.split("-")[4]));
}
input.close();
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public void showEmployeeList() {
for (Employee employee : getEmployeeList()) {
System.out.println(employee);
}
}
@Override
public Employee searchEmployeeByID(int id) {
for (Employee employee : getEmployeeList()) {
if (employee.getId() == id) {
return employee;
}
}
return null;
}
@Override
public void addEmployee(String name, String sex, int age, String department) {
try {
Writer output = new FileWriter("resource/Employee/EmployeeData", true);
output.write(getNextID() + "-" + name + "-" + sex + "-" + age + "-" + department + "\n");
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void removeEmployeeByID(int id) {
List<Employee> list = getEmployeeList();
Iterator<Employee> ite = list.iterator();
while (ite.hasNext()) {
if (ite.next().getId() == id) {
ite.remove();
}
}
try {
Writer output = new FileWriter("resource/Employee/EmployeeData");
for (Employee employee : list) {
output.write(employee.getId() + "-" + employee.getName() + "-" + employee.getSex() + "-"
+ employee.getAge() + "-" + employee.getDepartment() + "\n");
}
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public int getNextID() {
int maxID = 0;
for (Employee employee : getEmployeeList()) {
if (employee.getId() > maxID) {
maxID = employee.getId();
}
}
return maxID + 1;
}
}
import java.io.BufferedReader;
import java.io.FileReader;
public class EmployeeFactory {
public EmployeeDao getEmployeeDao() {
try {
BufferedReader input = new BufferedReader(new FileReader("resource/Employee/EmployeeSettings"));
String row = input.readLine();
input.close();
return (EmployeeDao) Class.forName(row).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
import java.util.Scanner;
public class EmployeeManagement {
private static Scanner scan = new Scanner(System.in);
public static void main(String[] args) {
EmployeeDao employeeDao = new EmployeeFactory().getEmployeeDao();
System.out.println("---welcome employee management---");
while (true) {
System.out.println("---main menu---");
System.out.println("0:exit the management");
System.out.println("1:show all employee list");
System.out.println("2:search employee by id");
System.out.println("3:add new employee");
System.out.println("4:remove employee by id");
System.out.println("-------------------");
String in = scan.next();
if ("0".equals(in)) {
System.out.println("exit now,please wait...");
System.exit(0);
} else if ("1".equals(in)) {
System.out.println("---employee list---");
employeeDao.showEmployeeList();
System.out.println("----------------------");
} else if ("2".equals(in)) {
System.out.println("please provide an id");
String SID = scan.next();
Integer id = stringToInt(SID);
if (id == null) {
System.out.println("illegal id !");
System.out.println("----------------------");
continue;
}
Employee emp = employeeDao.searchEmployeeByID(id);
if (emp == null) {
System.out.println("not found !");
System.out.println("----------------------");
} else {
System.out.println("---search result---");
System.out.println(emp);
System.out.println("---------------------");
}
} else if ("3".equals(in)) {
System.out.println("please provide the name");
String name = scan.next();
System.out.println("please provide the sex");
String sex = scan.next();
System.out.println("please provide the age");
String SAge = scan.next();
Integer age = stringToInt(SAge);
System.out.println("please provide the department");
String department = scan.next();
employeeDao.addEmployee(name, sex, age, department);
System.out.println("add success !");
System.out.println("----------------------");
} else if ("4".equals(in)) {
System.out.println("please provide an id");
String SID = scan.next();
Integer id = stringToInt(SID);
if (id == null) {
System.out.println("illegal id !");
System.out.println("----------------------");
continue;
}
Employee emp = employeeDao.searchEmployeeByID(id);
if (emp == null) {
System.out.println("not found !");
System.out.println("----------------------");
} else {
employeeDao.removeEmployeeByID(id);
System.out.println("remove success !");
System.out.println("----------------------");
}
}
}
}
public static Integer stringToInt(String str) {
Integer id = null;
try {
id = Integer.parseInt(str);
} catch (Exception e) {
return null;
}
return id;
}
}
import java.util.ArrayList;
public class FakeData {
public static ArrayList<Employee> employeeList=new ArrayList<Employee>();
static {
employeeList.add(new Employee(1, "张老狗", "男", 35, "技术部"));
employeeList.add(new Employee(2, "王大炮", "男", 28, "行政部"));
employeeList.add(new Employee(3, "李狗蛋", "男", 24, "财务部"));
employeeList.add(new Employee(4, "赵二蛋", "女", 19, "财务部"));
employeeList.add(new Employee(5, "孙建国", "女", 26, "行政部"));
}
}
文本数据:
- 将设置文本调整为:
运行结果:
- 将设置文本调整为:
运行结果:
与内存数据相比,文本数据能够长久保存操作结果:
new FileReader("resource/Employee/EmployeeData");
这里的路径采用的是相对路径,要求文件放在工程的文件夹下。