Factory Methodは、GoF(Gang of Four)のデザインパターンの一つで、オブジェクト指向プログラミングにおいて非常に重要な役割を果たします。
このパターンは、オブジェクトの生成をサブクラスに委譲することで、クラス間の結合度を低く保ち、柔軟性を向上させるものです。
本記事では、Factory Methodパターンの基本概念、使い方、そしてJavaでの実装サンプルについて詳しく解説します。
Factory Methodとは
Factory Methodパターンは、GoFの23のデザインパターンの中でも生成に関するパターンに分類されます。
このパターンの主な目的は、インスタンスの生成をサブクラスに任せることで、オブジェクトの生成方法を柔軟に変更できるようにすることです。
Factory Methodでは、具体的なオブジェクトの生成を抽象的な「工場」クラスが定義し、その具体的な実装をサブクラスで行います。
Factory Methodの役割
Factory Methodは、クラスのインスタンス化を動的に行う必要がある場合に役立ちます。
通常のインスタンス生成では、クライアントコードが具体的なクラス名に依存するため、クラスの変更や拡張に柔軟に対応するのが難しくなりますが、Factory Methodを使用することで、クライアントコードがどのクラスを使用しているかを意識せずにインスタンス生成を行うことができます。
Factory Methodの使い方
Factory Methodパターンを使用する場合、まず抽象クラスまたはインターフェースを作成し、その中にオブジェクトを生成するための「ファクトリメソッド」を定義します。
次に、この抽象クラスを継承する具体的なクラスで、ファクトリメソッドを実装してオブジェクトを生成します。
使用例
例えば、乗り物を作成するファクトリを考えてみましょう。
抽象クラスとして「VehicleFactory」を定義し、この中に「createVehicle」というメソッドを持たせます。
そして、具体的なクラス「CarFactory」や「BikeFactory」で、それぞれの乗り物を作成する実装を行います。
Factory Method実装サンプル
JavaでのFactory Methodパターンの実装例を紹介します。
public abstract class VehicleFactory {
public abstract Vehicle createVehicle();
}
public class CarFactory extends VehicleFactory {
@Override
public Vehicle createVehicle() {
return new Car();
}
}
public class BikeFactory extends VehicleFactory {
@Override
public Vehicle createVehicle() {
return new Bike();
}
}
public interface Vehicle {
void drive();
}
public class Car implements Vehicle {
@Override
public void drive() {
System.out.println("Car is driving");
}
}
public class Bike implements Vehicle {
@Override
public void drive() {
System.out.println("Bike is driving");
}
}
public class Main {
public static void main(String[] args) {
VehicleFactory carFactory = new CarFactory();
Vehicle car = carFactory.createVehicle();
car.drive();
VehicleFactory bikeFactory = new BikeFactory();
Vehicle bike = bikeFactory.createVehicle();
bike.drive();
}
}
このコードでは、抽象クラス「VehicleFactory」がファクトリメソッド「createVehicle」を持ち、サブクラスである「CarFactory」と「BikeFactory」がそれぞれ具体的な乗り物(Car、Bike)を生成しています。
まとめ
Factory Methodパターンは、オブジェクトの生成を動的に行う必要がある場面で非常に有効です。特に、クライアントコードを変更せずに新しいクラスの追加や既存クラスの変更を柔軟に行いたい場合に便利です。
Javaを使った実装例では、VehicleFactoryという抽象クラスを使い、車やバイクといった具象クラスを動的に生成しています。
Factory Methodパターンを適用することで、クライアントコードの柔軟性と保守性を向上させることができます。