Java Academy · レッスン

製品ファミリーのための Abstract Factory

Abstract Factory を使い、関連するオブジェクト群(プラットフォームごとの UI コンポーネントなど)を作成します。

レッスン 3/414 ステップ

「製品ファミリーのための Abstract Factory」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

Abstract Factory の目的

Abstract Factory は、具象クラスを指定せずに、関連するオブジェクトのファミリーを生成するためのインターフェースを提供します。1つのファクトリから生成されるプロダクトに互換性があることも保証します。

問題: 一貫性のないプロダクトファミリー

Abstract Factory がないと、Windows のボタンと Mac のチェックボックスを組み合わせてしまう可能性があります。このパターンは、すべてのプロダクトが同じファクトリから生成されるように強制し、見た目や動作の一貫性を保証します。

Abstract Factory インターフェース

ファミリーに含まれる各プロダクトの生成メソッドを持つインターフェースを定義します。各具象ファクトリは、1つのバリエーションに対応するすべてのメソッドを実装します。

public interface UIFactory {
    Button   createButton();
    Checkbox createCheckbox();
    TextField createTextField();
}

具象ファクトリ

各具象ファクトリは、1つのプラットフォームまたはテーマに対応するすべてのプロダクトを生成します。クライアントコードはインターフェースだけを参照し、具象ファクトリは参照しません。

public class WindowsUIFactory implements UIFactory {
    public Button    createButton()    { return new WindowsButton(); }
    public Checkbox  createCheckbox()  { return new WindowsCheckbox(); }
    public TextField createTextField() { return new WindowsTextField(); }
}
public class MacUIFactory implements UIFactory {
    public Button    createButton()    { return new MacButton(); }
    public Checkbox  createCheckbox()  { return new MacCheckbox(); }
    public TextField createTextField() { return new MacTextField(); }
}

抽象プロダクトインターフェース

各プロダクト型にはそれぞれ独自のインターフェースがあります。具象プロダクトは、プラットフォームごとにそのインターフェースを実装します。クライアントコードは具象プロダクトではなく、抽象プロダクトに対して記述します。

public interface Button   { void render(); void onClick(); }
public interface Checkbox  { void render(); boolean isChecked(); }
public interface TextField { void render(); String getValue(); }

ファクトリを使うクライアント

クライアントはコンストラクターを通じてファクトリを受け取ります。ファクトリのメソッドを呼び出してウィジェットを生成し、抽象プロダクトのインターフェースを通じて利用します。そのため、具象クラスから完全に分離されています。

public class Application {
    private final UIFactory factory;
    public Application(UIFactory factory) { this.factory = factory; }
    public void buildUI() {
        Button btn = factory.createButton();
        Checkbox cb = factory.createCheckbox();
        btn.render();
        cb.render();
    }
}

実行時のファクトリ選択

環境や設定に基づいて具象ファクトリを選択し、注入します。アプリケーションの他の部分では、プラットフォーム固有のクラスに一切言及しません。

String os = System.getProperty("os.name").toLowerCase();
UIFactory factory = os.contains("mac") ? new MacUIFactory() : new WindowsUIFactory();
new Application(factory).buildUI();

ファミリーへの新しいプロダクトの追加

新しいプロダクト(例: Slider)を追加するには、Abstract Factory インターフェースとすべての具象ファクトリを更新する必要があります。これはこのパターンの欠点です。

public interface UIFactory {
    Button   createButton();
    Checkbox createCheckbox();
    Slider   createSlider(); // new product — must update ALL factories
}

Abstract Factory とファクトリメソッドの比較

ファクトリメソッドはサブクラス化によって1つのプロダクトを生成します。Abstract Factory はコンポジションによってプロダクトのスイートを生成します。Abstract Factory は通常、複数のファクトリメソッドを組み合わせて実装します。

データベースドライバー向けの Abstract Factory

ConnectionFactory という Abstract Factory は、Connection、Statement、ResultSet オブジェクトを生成できます。ファクトリを変更するだけで、MySQL と PostgreSQL を切り替えられます。

public interface DBFactory {
    Connection  createConnection();
    Statement   createStatement();
}
public class MySQLFactory implements DBFactory { ... }
public class PgFactory   implements DBFactory { ... }

Spring プロファイルで使う Abstract Factory

Spring Boot では、プロファイルごとに異なる UIFactory Bean を定義します。アプリケーションは常に UIFactory を注入し、Spring が有効なプロファイルに対応する具象ファクトリを解決します。

@Configuration
@Profile("mac")
public class MacConfig {
    @Bean UIFactory uiFactory() { return new MacUIFactory(); }
}

一貫性の保証

最大の利点は、ファクトリが互換性のあるプロダクトだけを生成することです。Abstract Factory を正しく使用すれば、Mac のチェックボックスと Windows のボタンを誤って組み合わせることはありません。

確認問題

Abstract Factory がファクトリメソッドにはない、どのような保証を提供しますか。

まとめ

Abstract Factory は、共通のインターフェースを通じて関連するオブジェクトのファミリーを生成します。ファクトリを変更するだけで、プロダクトファミリー全体を切り替えられます。プロダクト間の一貫性が必要な場合に適していますが、新しいプロダクト型の追加にはオーバーヘッドが生じます。

無料で開始

AI チューターと学ぶ Java — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
104
レッスン
374

よくある質問

「製品ファミリーのための Abstract Factory」レッスンは無料ですか?

はい。「製品ファミリーのための Abstract Factory」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「製品ファミリーのための Abstract Factory」で何を学びますか?

Abstract Factory を使い、関連するオブジェクト群(プラットフォームごとの UI コンポーネントなど)を作成します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「製品ファミリーのための Abstract Factory」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Singleton:スレッドセーフな実装
  2. Factory Method パターン
  3. 製品ファミリーのための Abstract Factory
  4. Fluent API を使った Builder パターン
← Java Academyに戻る