2012-02-13 5 views
3

私はOOADクラスでの割り当てのためにJavaで小さなプログラムを書いていますが、私は正しい工場設計パターンを構成するものと、それを自分のプログラムに実装する方法を正確に理解することに問題があります。これはFactoryデザインパターンを使用していますか? (Java)

給与計算のための小さなプログラムです。 Employeeという基本クラスと、Hourly、Commissioned、Salariedという3つの派生(サブ)クラスがあります。彼らはそれぞれ、支払いのために異なるタイプのデータタイプを持っています。私はメインクラスとプログラム全体で一つのオブジェクトをインスタンス化することしかできません。多態性を通して、オブジェクトはクラス間で共有されなければならず、私は、オブジェクトに割り当てるオブジェクトを作成するためのファクトリメソッドを記述します。

私は、基本クラスを持っている:

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 
} 

そして3つの派生クラス:私はデータ型やその他の詳細の一部を残してきた

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

、私は、これは十分に情報であるべきだと思います。私は「本当の」ものを持っていますか?私は抽象的で具体的なファクトリメソッドやコンクリート製品などについて読んできましたが、私はまだ混乱しており、実装方法はわかりません。どのような助けや指針をいただければ幸いです!

答えて

4

あなたはほぼの方法を持っていますが、それほどではありません。問題は、empFactoryが静的​​でないことです。つまり、従業員に現行の従業員が必要になります。それを静的に変更すると、ファクトリパターンへの最初のステップが完了しました。

次のステップは、empFactoryメソッドのロジックを別のクラス、ファクトリクラスに委任することです。これにより、(呼び出し側に公開することなく)大幅な複雑さが可能になり、Factoryパターンの中核となります。

+1

工場を作成することのコアは、より複雑になっていますか? (申し訳ありません、抵抗することができませんでした) –

+0

私はFactoryメソッドを内部に持つFactoryクラスを作成します。しかし、従業員の種類ごとに別の「具体的な製品」クラスが必要ですか?それはどのように機能しますか? – Snorkelfarsan

+2

ファクトリを作成することのコアは複雑さを増し、きちんとしたインターフェイスでラッピングできます。 –

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(); 
    } 
} 
関連する問題