blog

ファクトリーメソッド・パターン」を学ぶための記事は、あなたには負けない!

まず褒めてから読む、なんと良い習慣でしょう。\n\n\n今日も、「自動車工場の開発と自動車用ソフトウェアの生産」というケースを取り上げて説明します。\n当初は、自動車工場が始まったばかりで、大きな名前...

Jan 15, 2021 · 4 min. read
シェア

前回の記事では、シンプルなビジネスや少数の「製品」に適したシンプルファクトリーパターンを紹介しました。

本日は、「自動車工場における自動車用ソフトウェアの開発・生産」の事例も取り上げて説明します。

当初、自動車工場が始まったばかりで、評判も大きくなく、販売も限られ、社長は国産車の生産だけで、この時に設計した自動車ソフトの生産は、"シンプルな工場モデル "の使用はまだ需要を満たすことができます。しかし、企業の発展に伴い、業界の拡大、ボスはもはや唯一の国産車の製造に満足していない、さらに合弁事業に乗り出した車。実際の需要に牽引され、合弁車を生産する支店を開設する必要があります。

オーナーとしては、経営しやすいように会社全体の仕組みを再構築することが必要です。本社 "を設立し、"支店 "を開設して異なるクルマを生産することで、一元管理を容易にします。この時点で、「単純工場モデル」で設計されたソフトウェアは、もはやこのモデルには適さないでしょう。

新しい要件に適応するために、新しいパターンが採用されます:「ファクトリーメソッドパターン」。

まず、ファクトリーメソッドパターンの基本的な定義を簡単に説明します

オブジェクトを作成する抽象メソッドを定義し、オブジェクトのインスタンス化をサブクラスに委ね、そのサブクラスがインスタンス化するクラスを決定します。

この簡単な文章の説明だけでは、「ファクトリーメソッド・パターン」を深く理解できないかもしれません。そこで、ファクトリーメソッドパターンの理解を深めていただくために、次のようなサンプルコードを用意しました。

ステップ1:様々な車両クラスを初期化します。

生産車用の抽象クラスの定義

public abstract class Vehicle {
 /**
 * 生産車の抽象的な方法
 */
 public abstract void production();
}

この抽象クラスを実装するサブクラスを定義します。

/**
 * 国産セダン
 */
public class DomesticCar extends Vehicle {
 @Override
 public void production() {
 System.out.println("国産車をプロデュースせよ!");
 }
}
/**
 * 国産SUV
 */
public class DomesticSUV extends Vehicle {
 @Override
 public void production() {
 System.out.println("国産SUVをプロデュースせよ!」);
 }
}
/**
 * 国産トラック
 */
public class DomesticTruck extends Vehicle {
 @Override
 public void production() {
 System.out.println("国産ローリーをプロデュースせよ!」);
 }
}
/**
 * ジョイント・ベンチャー・セダン
 */
public class JointVentureCar extends Vehicle {
 @Override
 public void production() {
 System.out.println("ジョイント・ベンチャー・カーを作ろう);
 }
}
/**
 * ジョイントベンチャーSUV
 */
public class JointVentureSUV extends Vehicle {
 @Override
 public void production() {
 System.out.println("ジョイントベンチャーSUVをプロデュースしよう!");
 }
}
/**
 * ジョイント・ベンチャー・ローリー
 */
public class JointVentureTruck extends Vehicle {
 @Override
 public void production() {
 System.out.println("ジョイント・ベンチャー・ローリーをプロデュースしよう!");
 }
}

ステップ 2: オブジェクトを作成する抽象メソッドを定義します。

public abstract class Factory {
 // 車両のサブクラスのインスタンスを作成するための抽象メソッド。
 public abstract Vehicle createVehicle(String vehicleType);
}

ステップ 3: オブジェクトのインスタンス化をサブクラスに延期します。

/**
 * 国産車工場の生産
 */
public class DomesticFactory extends Factory{
 @Override
 public Vehicle createVehicle(String vehicleType) {
 Vehicle vehicle = null;
 switch (vehicleType) {
 case "car":
 vehicle = new DomesticCar();
 break;
 case "suv":
 vehicle = new DomesticSUV();
 break;
 case "truck":
 vehicle = new DomesticTruck();
 break;
 }
 return vehicle;
 }
}
/**
 * 合弁自動車工場の生産
 */
public class JointVentureFactory extends Factory{
 @Override
 public Vehicle createVehicle(String vehicleType) {
 Vehicle vehicle = null;
 switch (vehicleType) {
 case "car":
 vehicle = new JointVentureCar();
 break;
 case "suv":
 vehicle = new JointVentureSUV();
 break;
 case "truck":
 vehicle = new JointVentureTruck();
 break;
 }
 return vehicle;
 }
}

ステップ4 テストクラスを定義します:

public class Demo {
 public static void main(String[] args) {
 Factory domesticFactory = new DomesticFactory();
 domesticFactory.createVehicle("car").production();
 Factory jointVentureFactory = new JointVentureFactory();
 jointVentureFactory.createVehicle("car").production();
 }
}

概要

シンプルファクトリーパターンと比較して、ファクトリーメソッドパターンはocpの原則に従います。新しい製品を追加する場合、元のコードを修正することなく、特定の製品のサブクラスとそれに対応するファクトリクラスを追加するだけです。そして、このパターンはプログラムの拡張とメンテナンスにより適しています。

ルーキー」の記事も悪くないと感じたら、くださいあなたのサポートが持続するために私の力です。また、あなたが指摘することができ、私はオープンマインドで教えられますことを願って問題を書くためにどこの記事。

Read next

ビューの無効化処理

nvalidateとnvalidateはどちらもViewの再描画を要求するためのAPIで、メインスレッドとサブスレッドで呼び出されます。 メソッド、続き...

Jan 15, 2021 · 11 min read