这是否使用工厂设计模式? (Java)的

时间:2012-02-13 01:35:17

标签: java polymorphism factory-pattern

我正在用Java编写一个小程序,用于在OOAD类中进行赋值,我很难理解什么是正确的工厂设计模式以及如何在我的程序中实现它。

这是一个小工资计算程序。有一个名为Employee的基类和三个名为Hourly,Commissioned和Salaried的派生(子)类。它们每种都有不同类型的付款数据类型。我只允许在主类和整个程序中实例化一个对象。通过多态性,对象应该在类之间共享,我将编写一个Factory方法来创建要分配给对象的对象。

我有基类:

public class Employee {

protected Employee empFactory(int empType){
    if (empType == 1)
        return new Hourly();
    if (empType == 2)
        return new Commissioned();
    if (empType == 3)
        return new Salaried();
    else
        return null;
}

public static void main(String[] args) {
    // TODO code application logic here
}

三个派生类:

public class Commissioned extends Employee
public class Hourly extends Employee
public class Salaried extends Employee

我遗漏了一些数据类型和其他细节,我认为这应该是足够的信息。工厂方法我有“真正的”吗?我一直在阅读抽象和具体的工厂方法和具体产品等,但我仍然感到困惑,不知道如何实现它。任何帮助或指示将不胜感激!

3 个答案:

答案 0 :(得分:4)

你几乎有一个工厂方法,但并不完全。问题是empFactory不是静态的,这意味着现在使用它来雇佣员工需要现有的员工。将其更改为静态,您已进入工厂模式的第一步。

下一步是将empFactory方法的逻辑委托给一个单独的类,一个工厂类。这样可以实现更高的复杂性(不会将其暴露给调用者),并且是Factory模式的全部核心。

答案 1 :(得分:0)

假设你知道泛型,你可以做一个更好的工厂方法,它允许你构造Employee的子类的任何对象。

public static <T extends Employee> T empFactory(Class<T> clazz) {
    try {
        return clazz.newInstance();
    }
    catch(Exception e){
        return null;
    }
}

一个简单的例子:

public static void main(String[] args) {
    Employee emp = Employee.empFactory(Hourly.class);

    System.out.println("The salary is " + emp.getSalary());
}

这允许您实例化任何Employee派生类,而无需在每次添加新派生类时更改工厂方法。它还使您从丑陋的(int,派生类)关联中解放出来,因为您可以通过简单地指定所需的派生类来实例化对象。

如果需要访问特定于类的方法,也可以强制转换实例:

Hourly hh = (Hourly) emp;

System.out.println("Salary is " + hh.getSalaryH());

注意:我的Employee类有一个getSalary()方法,而我的Hourly类有一个getSalaryH()方法。

答案 2 :(得分:0)

请在下面找到描述工厂模式的示例。

interface vehicle {
    void start();
    void stop();
}
class car implements vehicle {
    public void start() {
        System.out.println("Start car");
    }
    public void stop() {
        System.out.println("Stop car");
    }
}
class bike implements vehicle {
    public void start() {
        System.out.println("Start bike");
    }
    public void stop() {
        System.out.println("Stop bike");
    }
}
class factory {
    public static vehicle getVehicle(int ch) { //(?)sould be interface type
        vehicle v = null;//local always inialize otherwise error
        //car c = new car();
        //bike b = new bike();
        if(ch == 1) {
            v = new car();
        } else {
            v = new bike();
        }
        return v;
    }
}
class factorymain {
    public static void main(String[] args) {
        vehicle v;
        v = factory.getVehicle(Integer.parseInt(args[0]));
        v.start();
        v.stop();
    }
}