Java中如何实现抽象工厂实例化Worker对象并按工种计算薪酬
现有代码问题说明
现有代码无法正常运行,核心问题如下:
- Worker抽象类未定义有参构造方法,子类调用
super()语句会直接编译报错 - Mason类的
getworkerType()方法名拼写错误,首字母未大写,没有正确重写父类的getWorkerType()方法,会导致类型获取异常 - WorkerFactory的
createWorker()逻辑完全错误:初始定义Worker worker = null后直接判断if(worker != null),整个分支永远不会执行;switch分支没有break,也没有return语句,方法不符合返回值要求;实例化逻辑错误,先创建无参空对象,再用空对象的null属性创建新对象,最终得到的实例所有属性都是null - WorkerFactoryProvider的
getWorkerFactory()逻辑错误,本应返回工厂实例,实际逻辑中直接创建Worker实例,最后永远返回null;switch无break会出现分支穿透问题 - 包名不一致:Electrician类在
worker.domain.worker包下,Mason类在worker.domaine.worker包下,导包会报错
代码调整方案
1. 修复基础类定义
统一包名,补充父类构造,修正重写方法,同时新增抽象薪酬计算方法:
public abstract class Worker { String phoneNumber; String firstName; String lastName; String workerType; String ifu; String imagePath; // 补充有参构造 public Worker(String phoneNumber, String firstName, String lastName, String ifu, String workerType, String imagePath) { this.phoneNumber = phoneNumber; this.firstName = firstName; this.lastName = lastName; this.ifu = ifu; this.workerType = workerType; this.imagePath = imagePath; } // 抽象薪酬计算方法,不同工种各自实现 public abstract double calculateSalary(int workParam); public String getWorkerType() { return workerType; } // 按需补充其他getter/setter }
电工类实现
package worker.domain.worker; public class Electrician extends Worker{ public Electrician(String phoneNumber, String firstName, String lastName, String ifu, String imagePath) { // 固定工种类型,无需传入 super(phoneNumber, firstName, lastName, ifu, "Electrician", imagePath); } @Override public double calculateSalary(int workHours) { // 示例:电工按工时计算薪酬,每小时80 return workHours * 80.0; } }
泥瓦工类实现
package worker.domain.worker; public class Mason extends Worker{ public Mason(String phoneNumber, String firstName, String lastName, String ifu, String imagePath) { super(phoneNumber, firstName, lastName, ifu, "Mason", imagePath); } @Override public String getWorkerType() { return "Mason"; } @Override public double calculateSalary(int workArea) { // 示例:泥瓦工按施工面积计算薪酬,每平50 return workArea * 50.0; } }
2. 修复抽象工厂实现
按抽象工厂模式,每个工种对应独立的工厂实现:
package worker.domain.worker; // 抽象工厂接口 public interface WorkerAbstractFactory { Worker createWorker(String phoneNumber, String firstName, String lastName, String ifu, String imagePath); } // 电工工厂实现 public class ElectricianFactory implements WorkerAbstractFactory { @Override public Worker createWorker(String phoneNumber, String firstName, String lastName, String ifu, String imagePath) { return new Electrician(phoneNumber, firstName, lastName, ifu, imagePath); } } // 泥瓦工工厂实现 public class MasonFactory implements WorkerAbstractFactory { @Override public Worker createWorker(String phoneNumber, String firstName, String lastName, String ifu, String imagePath) { return new Mason(phoneNumber, firstName, lastName, ifu, imagePath); } }
3. 修复工厂提供类
public class WorkerFactoryProvider { public static WorkerAbstractFactory getWorkerFactory(String workerCategory) { if (workerCategory == null) { return null; } switch (workerCategory) { case "Electrician": return new ElectricianFactory(); case "Mason": return new MasonFactory(); default: return null; } } }
使用示例
public class Main { public static void main(String[] args) { // 获取电工工厂,创建电工实例 WorkerAbstractFactory electricianFactory = WorkerFactoryProvider.getWorkerFactory("Electrician"); Worker electrician = electricianFactory.createWorker("123456789", "Jean", "Paul", "IFU001", "/img/ele.png"); System.out.println(electrician.getWorkerType()); // 输出Electrician // 计算工作10小时的薪酬 System.out.println("电工薪酬:" + electrician.calculateSalary(10)); // 输出800.0 // 获取泥瓦工工厂,创建泥瓦工实例 WorkerAbstractFactory masonFactory = WorkerFactoryProvider.getWorkerFactory("Mason"); Worker mason = masonFactory.createWorker("987654321", "Pierre", "Jacques", "IFU002", "/img/mason.png"); System.out.println(mason.getWorkerType()); // 输出Mason // 计算施工20平的薪酬 System.out.println("泥瓦工薪酬:" + mason.calculateSalary(20)); // 输出1000.0 } }
内容的提问来源于stack exchange,提问作者gbeto Jean-José
相关产品推荐
相关产品推荐

