ファクトリーパターンの概要
ソフトウェア開発におけるオブジェクト生成を効率化するデザインパターンの一つ。生成ロジックと利用側の依存関係を解消し、拡張性を向上させる。
1. シンプルファクトリーパターン
有限の製品タイプを扱う際に有効。静的メソッドによるインスタンス生成が特徴。
構成要素
- 抽象製品インターフェース
- 具体的製品クラス群
- ファクトリークラス
コード例
// 抽象製品インターフェース
public interface Device {
void displayModel();
}
// 具体的製品クラス1
public class Galaxy implements Device {
@Override
public void displayModel() {
System.out.println("Galaxy Sシリーズ");
}
}
// 具体的製品クラス2
public class iPhone implements Device {
@Override
public void displayModel() {
System.out.println("iPhone Proシリーズ");
}
}
// ファクトリークラス
public class DeviceFactory {
public static Device createDevice(String type) {
if("galaxy".equals(type)) {
return new Galaxy();
} else if("iphone".equals(type)) {
return new iPhone();
}
return null;
}
}
2. ファクトリーメソッドパターン
基底クラスで生成プロセスを定義し、サブクラスで具体的なインスタンス生成を実装する。
構成要素
- 抽象ファクトリーメソッド
- 具体的ファクトリークラス
- 抽象製品インターフェース
コード例
// 抽象ファクトリー
public interface DeviceFactory {
Device createDevice();
}
// 具体的ファクトリー1
public class SamsungFactory implements DeviceFactory {
@Override
public Device createDevice() {
System.out.println("Samsung工場で製造");
return new Galaxy();
}
}
// 具体的ファクトリー2
public class AppleFactory implements DeviceFactory {
@Override
public Device createDevice() {
System.out.println("Apple工場で製造");
return new iPhone();
}
}
3. 抽象ファクトリーパターン
関連製品群を一貫して生成するためのインターフェースを提供。
構成要素
- 抽象ファクトリー(複数生成メソッド)
- 具体的ファクトリー
- 製品階層インターフェース群
コード例
// 追加製品インターフェース
public interface Battery {
void showCapacity();
}
// 具体的製品クラス
public class LithiumBattery implements Battery {
@Override
public void showCapacity() {
System.out.println("5000mAh リチウムイオン");
}
}
// 抽象ファクトリー拡張
public interface AdvancedFactory {
Device createDevice();
Battery createBattery();
}
// 具体的ファクトリー拡張
public class SamsungAdvancedFactory implements AdvancedFactory {
@Override
public Device createDevice() {
return new Galaxy();
}
@Override
public Battery createBattery() {
return new LithiumBattery();
}
}
利用例
public static void main(String[] args) {
AdvancedFactory factory = new SamsungAdvancedFactory();
Device device = factory.createDevice();
Battery battery = factory.createBattery();
device.displayModel();
battery.showCapacity();
}