2012-05-12 14 views
4

実際には単純なファクトリメソッドのデザインパターンの例をJavaで作成しようとしています。私はJavaを実際には知っていません、私は一般的なプログラミングには新しいですが、私はJavaで実装された基本的なFactoryMethodの例を考え出す必要があります。以下は私が思いついたものです。私は確かにかなりのエラーがあります。私は明らかにいくつかのコンストラクタを紛失しています。抽象クラスとインタフェースと混同します。あなたは私の間違いを指摘し、私のコードを説明とともに訂正してください。あなたの時間と助けのために事前に感謝します。ファクトリメソッドJavaのトラブルのパターン例

public abstract class Person 
{ 
    public void createPerson(){ } 
} 

public class Male extends Person 
{ 
    @Override 
    public void createPerson() 
    { 
     System.out.print("a man has been created"); 
    } 
} 

public class Female extends Person 
{ 
    @Override 
    public void createPerson() 
    { 
     System.out.print("a woman has been created"); 
    } 
} 

public class PersonFactory 
{ 
    public static Person makePerson(String x) // I have no Person constructor in 
    {           // the actual abstract person class so 
     if(x=="male")       // is this valid here? 
     { 
      Male man=new Male(); 
      return man; 
      } 
      else 
     { 
      Female woman=new Female(); 
      return woman; 
     } 
    } 
} 


public class Test 
{ 
    public static void main(String[] args) 
    { 
     Person y= new Person(makePerson("male")); // definitely doing smth wrong here 
     Person z= new Person(makePerson("female")); // yup, here as well 
    } 
} 
+0

あなたはパラメータを持つコンストラクタを定義しない限り、クラスのための暗黙の、パラメータなし 'new'があります。 –

+1

"...そして私のコードを説明とともに訂正してください?"これは宿題修正サービスではありません。コンパイルエラーを表示し、動作上の問題を説明してください。ここの努力はあなたのものでなければなりません*。 –

+2

@Hovercraft Eelsの完全なこれは宿題ではありません。私は試験のために勉強しており、FactoryMethodデザインパターンを勉強する必要があります。インターネットは、私が不必要に複雑に感じるJavaの例でいっぱいです。私は "欺く"しようとしていない私は私が書いたが、動作していないコードをあなたに提供した理由を学ぶことを試みている。 –

答えて

8

の間で一般的なもので、具体的な実装を持っています:

  1. createPerson方法は役に立たない。
  2. ファクトリメソッドを呼び出す方法が間違っています。
  3. ファクトリメソッドで.equalsの代わりに==を使用します。

私はPersonクラスを拡張して、MaleクラスとFemaleクラスが共有するメンバフィールドを追加して、共通の抽象コンストラクタを共有する方法を示しました。

public abstract class Person { 
    protected final String name; 
    public Person(String name) { 
     this.name = name; 
    } 
} 

public class Male extends Person { 
    public Male(String name) { 
     super(name); 
    } 
} 

public class Female extends Person { 
    public Female(String name) { 
     super(name); 
    } 
} 

public class PersonFactory 
{ 
    public static Person makePerson(String gender, String name) 
    { 
     if(gender.equals("male"))      
     { 
      Male man=new Male(name); 
      return man; 
     } 
     else 
     { 
      Female woman=new Female(name); 
      return woman; 
     } 
    } 
} 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     Person y= PersonFactory.makePerson("male", "bob")); 
     Person z= new PersonFactory.makePerson("female", "janet")); 
    } 
} 
+1

うわーありがとうアミール、それは私が探していたものです。私は今あなたのコードを見て、何が起こっているのか理解しようとします..ポールとデイブにも感謝します! :) –

+1

一般的な意味では、この実装はシンプルファクトリパターンと呼ばれ、デザインパターンではなくOOPです。まもなく答えとして一例を挙げていくつもりです。 – maress

+0

ニース例:)ありがとう!+1 –

2

は次のようになります。

public class Test 
{ 
    public static void main(String[] args) 
    { 
     Person y= PersonFactory.makePerson("male"); 
     Person z= PersonFactory.makePerson("female"); 
    } 
} 

であることが

PersonFactory.makePerson("male") 

である理由あなたは「新しい」クラスにする必要がないことを意味し、静的メソッドmakePersonを(持っているので、インスタンスメソッドではないのでメソッドを呼び出します)。つまり、クラスの静的変数はクラスのすべてのインスタンスで使用できます。静的メソッドは、

さらにTheClassItIsDefinedIn.TheMethodSignatureと呼ばれている:あなたはここに(ここにも一切示されていない)の派生型の間で共有されている機能的なコードを持っていないとして

public abstract class Person 
{ 
    public void createPerson(){ } 
} 

が本当にインターフェイスでなければなりません私はメソッドblahとblah2を持っているので、私を実装するどのクラスもその名前とシグネチャのメソッドを持たなければなりません(そして、それはそこに好きなコードを持つことができます)。返品の種類などと一致する限り) '

抽象

:抽象クラスは、ちょうどインターフェースのようなメソッドシグネチャを持つことができますが、それはまた、通常、以下の修正されたバージョンではいくつかの問題がある簡単に言えば、すべての派生タイプ

+0

えええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええ> makePerson関数が、男性と女性のオブジェクトを作成するよう呼びかけていませんか? –

+0

あなたのデバッグ環境にブレークポイントを追加してテストしてください(それは必要です) –

+1

@ user1073400何も 'createPerson'を呼び出さないので。 –

2

デザインパターンの適用を開始する前に、Javaプログラミングでグリップを取得することをお勧めします。 デザインパターンは通常、OOの原則を必要とします。そのため、良いプログラミング方法がない場合には意味がありません。

しかし、ファクトリメソッドの定義は、意味の文脈では正しく表示されますが、ユーザビリティではありません。ファクトリメソッドはオブジェクトを作成し、作成されたオブジェクトへの参照を返す必要があります。さらに、作成されたインスタンスは、オブジェクト(この場合はPerson)によって使用されることが想定されているため、作成されたオブジェクトは通常、ファクトリメソッドパターンを実装するクラスとは異なります。

ここでは、おそらくファクトリパターンの使用方法の抽象的な例があります。 @maress'コードに基づいて

public abstract class Student { 
    } 

    public class PrimarySchoolStudent extends Student { 
    } 

    public class HighSchoolStudent extends Student { 
    } 

    public abstract class ClassRoom { 

    private List<Student> students; 

    void enrollStudent(String studentId) { 
     Student student = newStudent(); 
     students.add(student); 
    } 

    abstract Student newStudent(); 
    } 

    public class HighSchoolClassRoom extends ClassRoom { 

    @Override 
    Student newStudent() { 
     return new HighSchoolStudent(); 
    } 
    } 

    public class PrimarySchoolClassRoom extends ClassRoom { 

    @Override 
    Student newStudent() { 
     return new PrimarySchoolStudent(); 
    } 
    } 
+0

このコード例を私に提供してくれてありがとう、ありがとう。それは私のものよりも複雑に思えますが、私もそれを見て、何が起こっているのかを理解しようとします。私はC++でのプログラミングとクラスの作成にもっと精通していますが、Javaではそうではありません。 –

+0

これはファクトリメソッドの最良の例です! – vins

+0

抽象メソッドnewStudentは実際にはファクトリメソッドです。この例は、switchまたはif-elseステートメントを使用して実装された[単純なファクトリパターン]とは異なります。 – wangdq

0

コンプリート例:

import java.util.ArrayList; 
import java.util.List; 

abstract class Student { 
    private int StudentID; 

    public Student() { 
    } 

    public Student(int _studentId) { 
     this.StudentID = _studentId; 
    } 

} 

class PrimarySchoolStudent extends Student { 

    public PrimarySchoolStudent() { 
    } 

    public PrimarySchoolStudent(int _studentId) { 
     super(_studentId); 
    } 
} 

class HighSchoolStudent extends Student { 

    public HighSchoolStudent() { 
    } 

    public HighSchoolStudent(int _studentId) { 
     super(_studentId); 
    } 
} 

abstract class ClassRoom { 
    private List<Student> students; 

    public void enrollStudent(int studentId) { 
     if (students == null) 
     { 
      students = new ArrayList<Student>(); 
     } 
     Student student = newStudent(studentId); 
     students.add(student); 
    } 

    abstract Student newStudent(int studentId); 
} 

class HighSchoolClassRoom extends ClassRoom { 

    @Override 
    Student newStudent(int studentId) { 
     return new HighSchoolStudent(studentId); 
    } 
} 

class PrimarySchoolClassRoom extends ClassRoom { 

    @Override 
    Student newStudent(int studentId) { 
     return new PrimarySchoolStudent(studentId); 
    } 
} 

public class RunCode { 
    public static void main(String[] args) { 

     ClassRoom cr_highSchool = new HighSchoolClassRoom(); 
     cr_highSchool.enrollStudent(1234); 
     cr_highSchool.enrollStudent(5678); 
     cr_highSchool.enrollStudent(1938); 
     cr_highSchool.enrollStudent(7465); 
    } 
} 
関連する問題