あなたはFactory
が生成されるかを検討する必要がありFactory Pattern
最初のを実装します。 Vehicles
を作りましょう。
public VehicleFactory {
public Vehicle newVehicle(String type) {
...
}
}
これは、下のクラス階層に従ってVehicles
を生成します。
public interface Vehicle {
public List<Door> getDoors();
}
public class Motorcycle implements Vehicle {
public List<Door> getDoors() {
return Collections.<Door>emptyList();
}
}
public class SportsCar implements Vehicle {
public List<Door> getDoors() {
return Collections.<Door>unmodifiableList(Arrays.asList(new Door("driver"), new Door("passenger"));
}
}
public class Hatchback implements Vehicle {
public List<Door> getDoors() {
return Collections.<Door>unmodifiableList(Arrays.asList(new Door("driver"), new Door("passenger"), new Door("back"));
}
}
その後
public Vehicle newVehicle(String type) {
if ("motorcycle".equals(type)) { return new Motorcycle(); }
if ("sports car".equals(type)) { return new SportsCar(); }
if ("hatchback".equals(type)) { return new Hatchback(); }
return null;
}
ように見えるかもしれませんあなたVehicleFactory
方法は今のメインの質問は、「なぜ、あなたはこれを行うにしたいですか?」され
多くの場合、 関連項目を構築するためのきれいなインターフェイスが必要です。関連項目にInterfaceとFactory を作成してそれらを作成します。これにより、ソフトウェアのこの部分を使用している誰かがInterfaceクラスとItemFactoryを単に引き出すことができます。 彼らは 個々の詳細を参照してください、そのコードを簡素化します。あなたはプログラミングエラーがあった場合は、上記のコードでVehicles
のすべての実装の詳細を隠した(または何かを追加したい)、あなたはVehicles
の1を修正(または新規Vehicle
を追加する)ことができるので
工場に戻し、VehicleFactory
を含むライブラリ(JARファイル)を再リリースします。
他の人がVehicleFactory
メソッドを使用していることがわかっているので、コンパイル時にコードが破損する心配はありません。また、あなたが不注意でない限り、実行時に確実に動作することを保証することもできます。
これは、動作が変更されないということと同じではありません。 Vehicle
の新しい実装が返されます。うまくいけば、埋め込まれたバグは少なくなります。また、彼らはnewVehicle("station wagon")
かそのようなものを呼び出すまで、あなたが追加したかもしれない "新車"を求めなかったので、彼らはそれらを見ないでしょう。
また、Vehicles
のビルド方法を変更することもできます。後であなたが単純な実装スタイル「ただ一つのパスでそれを構築」したくないと判断した場合たとえば、あなたは
public Vehicle newVehicle(String type) {
Chassis chassis;
if ("motorcycle".equals(type)) {
chassis = new TwoWheelChassis();
} else {
chassis = new FourWheelChassis();
}
return new ComponentVehicle(chassis, getDoorCount(type));
}
ので
のような場所
ComponentVehicle
道具「newVehicle(...)」を変えることができ
Vehicle
なんらかの理由で明示的な
Chassis
オブジェクトが必要です。
コメント欄に質問「メソッドの数を」見
---更新---
Factory pattern
は、多くの方法については、実際にはありませんが、およそ1の方法は、アウト抽象的なものを構築する能力を有します1つ以上の具体的なものの
したがって、上記の例では、私が
public VehicleFactory {
public Vehicle newVehicle(String type) { ... }
public Vehicle newRedVehicle(String type) { ... }
public Vehicle newBlackVehicle(String type) { ... }
}
を持っている可能性があり、それらはすべてVehicle
の種類に関してacceptibleファクトリメソッドになりますが、彼らは、色に関しては、工場指向の方法ではないでしょうVehicle
の
同時に種類と色を処理できるファクトリメソッドを取得するには、ファクトリメソッド
public Vehicle newVehicle(String type, String color) { ... }
が追加される可能性があります。場合によっては組み合わせが意味をなさないことがあるので、すべてのファクトリメソッドを単一のファクトリメソッドにパックする価値があるかもしれません。
ファクトリオブジェクトのメソッドは、インターフェイスの複数の基本型を返す可能性がない限り、ファクトリメソッドではありません。同様に、メソッド外にオブジェクトを構築する方法を指定する必要がある場合は、ファクトリメソッドではありません。
Vehicle
をビルドする方法の制御を、ファクトリで使用していたときに「工場だっただろう」という方法でクライアントに渡す必要がある場合は、Builder pattern
が必要です。どのようBuilder Pattern
異なった例はありません、あいまいな用語である
VehicleBuilder builder = new VehicleBuilder();
builder.addDoor("driver");
builder.addDoor("passenger");
builder.paintVehicle("red");
Vehicle vehicle = builder.getVehicle();
[OK]を、私はそれにオーバーロードされたメソッドを保つことができますか? – SOP
これは役立つかもしれませんhttps://www.tutorialspoint.com/design_pattern/factory_pattern.htm – Daedric
さて、あなたは工場の静的メソッドを持つ必要はありませんが、私はちょうどそれがそうするのがより理にかなっていると思います。こちらを参照してください:https://stackoverflow.com/a/929273/5244131 –