2012-02-13 4 views
3

Я пишу небольшую программу на Java для задания в классе OOAD, и у меня есть проблема с пониманием того, что представляет собой правильный шаблон проектирования фабрики и как реализовать его в моей программе.Использует ли это шаблон фабричного дизайна? (java)

Это небольшая программа расчета заработной платы. Существует базовый класс под названием 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 

Я оставил некоторые из типов данных и других деталей, я думаю, что это должно быть достаточно информации. Является ли метод фабрики «реальным»? Я читал об абстрактных и конкретных фабричных методах и конкретных продуктах и ​​т. Д., Но я все еще смущен, не знаю, как его реализовать. Любая помощь или указатели будут очень благодарны!

ответ

4

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

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

+1

Ядро создания заводов создает большую сложность? (Извините, не смог устоять) –

+0

Так что я сделаю класс Factory с заводским методом внутри. Но нужен ли мне еще один класс «конкретного продукта» для каждого типа сотрудников, как это работает? – Snorkelfarsan

+2

Ядро создания заводов _allowing_ сложнее и обертывает его в аккуратном интерфейсе. –

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()); 
} 

Это позволяет создать экземпляр любого сотрудника производного класса без изменения Фабричный метод каждый раз, когда вы добавляете новый производный класс. Он также освобождает вас от уродливой (int, производного класса) ассоциации, потому что вы можете создать экземпляр объекта, просто указав нужный производный класс.

Вы также можете бросить экземпляр, если вам необходимо получить доступ к определенным методам класса:

Hourly hh = (Hourly) emp; 

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

Примечание: Мой класс Employee имеет метод getSalary() и мой Ежечасно класс имеет метод getSalaryH().

+0

Было бы неплохо использовать дженерики, но это не часть задания. Не знаю, одобрит ли его учитель (не то, чтобы это было плохое решение, но у него, казалось, было очень конкретное решение). – Snorkelfarsan

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(); 
    } 
} 
Смежные вопросы