抽象ファクトリーパターンの実践的実装

抽象ファクトリーパターンの核心概念

このデザインパターンは、関連するオブジェクト群を一括生成するインターフェースを提供します。特定のクラス実装を指定せず、製品ファミリー全体を一貫して構築できる仕組みです。ファクトリーメソッドパターンを拡張し、複数の製品階層を扱う場合に有効です。

適用シナリオの明確化

複数の製品ファミリー(例:スマートデバイス製品ライン)が存在し、アプリケーションが特定のファミリー内で一貫した製品セットを使用する必要がある場合に適用します。製品ファミリーとは、同一ブランドや技術基盤で設計された相互運用可能な製品群を指します。

実装ステップの再構築

1. 基本デバイスインターフェースの定義

/**
 * 汎用デバイス操作の基底インターフェース
 */
public interface Device {
    void powerOn();
    void powerOff();
    String getDeviceType();
}

2. ネットワーク機器インターフェースの追加

/**
 * 通信機能を備えたデバイスの拡張インターフェース
 */
public interface NetworkDevice extends Device {
    void activateConnection();
}

3. ブランドA製品の実装

public class AlphaSmartphone implements Device {
    @Override
    public void powerOn() {
        System.out.println("[Alpha] モバイル端末を起動");
    }
    
    @Override
    public void powerOff() {
        System.out.println("[Alpha] モバイル端末を停止");
    }

    @Override
    public String getDeviceType() {
        return "スマートフォン";
    }
}

4. ブランドAネットワーク機器の実装

public class AlphaRouter implements NetworkDevice {
    @Override
    public void powerOn() {
        System.out.println("[Alpha] ルーターを起動");
    }

    @Override
    public void activateConnection() {
        System.out.println("Wi-Fi接続を確立");
    }

    // その他の必須メソッド実装
    @Override public void powerOff() { /* 実装省略 */ }
    @Override public String getDeviceType() { return "ルーター"; }
}

5. 抽象ファクトリーの設計

/**
 * 製品ファミリー生成のための共通インターフェース
 */
public interface DeviceFactory {
    Device createMobileDevice();
    NetworkDevice createNetworkDevice();
}

6. ブランド固有ファクトリーの実装

public class AlphaDeviceFactory implements DeviceFactory {
    @Override
    public Device createMobileDevice() {
        return new AlphaSmartphone();
    }

    @Override
    public NetworkDevice createNetworkDevice() {
        return new AlphaRouter();
    }
}

7. 実行環境の構築

public class DeviceSystem {
    public static void main(String[] args) {
        // ブランドAのファクトリーを取得
        DeviceFactory factory = new AlphaDeviceFactory();
        
        // 一貫した製品ファミリーの生成
        Device mobile = factory.createMobileDevice();
        NetworkDevice router = factory.createNetworkDevice();
        
        // 統合動作の検証
        mobile.powerOn();
        router.activateConnection();
        System.out.printf("構成: %s + %s%n", 
                         mobile.getDeviceType(), 
                         router.getDeviceType());
    }
}

パターンの特性分析

有効性の根拠

  • 製品ファミリー間の一貫性を保証するため、互換性のないコンポーネントが混在するリスクを排除
  • クライアントコードが具体的な実装クラスに依存せず、インターフェースのみで動作可能

制約事項の認識

  • 新規製品タイプの追加には、既存ファクトリーインターフェースの変更が必要
  • 初期設計段階で製品階層構造を確定させる必要があり、柔軟性に限界

タグ: Java デザインパターン 依存関係の逆転

7月23日 19:55 投稿