Использует ли это шаблон проектирования фабрики? (Джава) - PullRequest
3 голосов
/ 13 февраля 2012

Я пишу небольшую программу на 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 ]

4 голосов
/ 13 февраля 2012

У вас почти есть фабричный метод , но не совсем.Проблема в том, что empFactory не является статичным, что означает, что для того, чтобы сделать Сотрудника с ним прямо сейчас, требуется существующий Сотрудник.Измените его на статический, и вы сделали первый шаг в шаблоне Factory.

Следующий шаг - делегировать логику метода empFactory отдельному классу, классу фабрики.Это значительно усложняет работу (не раскрывая ее вызывающей стороне) и составляет все ядро ​​шаблона Factory.

0 голосов
/ 13 декабря 2013

Ниже приведен пример, описывающий фабричный шаблон.

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();
    }
}
0 голосов
/ 13 февраля 2012

Если вы знаете дженерики, вы можете создать гораздо лучший фабричный метод, который позволяет вам создавать любой объект подкласса 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 ().

...