You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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é

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:45:04