ホームページ >Java >&#&チュートリアル >抽象的な工場パターン

抽象的な工場パターン

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-21 04:59:10186ブラウズ

抽象ファクトリーパターンとは何ですか?

Abstract Factory Pattern は、具体的なクラスを指定せずに、関連オブジェクトまたは依存オブジェクトのファミリーを作成するためのインターフェイスを提供する作成パターンです。

いつ使用しますか?

1 つのファミリー内のオブジェクトが連携して動作することが期待されるオブジェクトのファミリーがあり、それでも具体的なプロダクトとそのファクトリーをクライアント コードから分離したい場合は、抽象ファクトリー パターンを使用します。

問題

クライアントが好みに応じて明るい UI または暗い UI を選択できる、シンプルなテーマ アプリケーションを開発する予定です。ボタン、メニュー、ツールバーの 3 つのコンポーネントを用意します。各コンポーネントには明るいスタイルと暗いスタイルの外観があります。
明らかに、すべてのライト テーマ コンポーネントが連携して動作することを確認したいと考えています (ライト ボタン、ダーク メニュー、およびライト ツールバーを同時に表示したくありません)。さらに、将来的には「ハイコントラスト」テーマなどの他のテーマを追加する可能性も残したいと考えています。

解決

Abstract Factory Pattern

  1. テーマアプリケーション
    これが私たちのクライアントです。コンストラクターは引数として具象ファクトリを受け取り、createComponents() が対応するコンポーネントを作成します。クライアントは抽象的なファクトリーと抽象的な製品にのみ依存します。

  2. テーマファクトリー
    すべての具体的なテーマのインターフェース。

  3. 具体的なテーマファクトリー
    ThemeFactory のメソッドの実際の実装を提供します。これらのコンクリート工場はコンクリート製品を製造します。

  4. 製品インターフェース
    コンポーネントのインターフェイス。

  5. コンクリート製品
    特定の動作を定義します。

構造

Abstract Factory Pattern

Javaでの実装

public interface Button {

    void render();
}
public class DarkButton implements Button{

    @Override
    public void render() {
        System.out.println("Successfully render a dark button");
    }
}
public class LightButton implements Button {

    @Override
    public void render() {
        System.out.println("Successfully render a light button");
    }
}

メニュー コンポーネントとツールバー コンポーネントのコードも同じ方法で記述できます。

public interface ThemeFactory {

    Button createButton();

    Menu createMenu();

    Toolbar createToolbar();
}
public class DarkThemeFactory implements ThemeFactory {

    @Override
    public Button createButton() {
        return new DarkButton();
    }

    @Override
    public Menu createMenu() {
        return new DarkMenu();
    }

    @Override
    public Toolbar createToolbar() {
        return new DarkToolbar();
    }
}
public class LightThemeFactory implements ThemeFactory {

    @Override
    public Button createButton() {
        return new LightButton();
    }

    @Override
    public Menu createMenu() {
        return new LightMenu();
    }

    @Override
    public Toolbar createToolbar() {
        return new LightToolbar();
    }
}
// This is our client code, notice client sees neither concrete products nor concrete factories
public class ThemeApplication {

    private ThemeFactory themeFactory;
    private Button button;
    private Menu menu;
    private Toolbar toolbar;

    public ThemeApplication(ThemeFactory factory) {
        themeFactory = factory;
        createComponents();
    }

    public void createComponents() {
        button = themeFactory.createButton();
        menu = themeFactory.createMenu();
        toolbar = themeFactory.createToolbar();
    }

    public void renderComponents() {
        button.render();
        menu.render();
        toolbar.render();
    }
}
public class ThemeApplicationTestDrive {

    public static void main (String[] args) {
        ThemeFactory darkFactory = new DarkThemeFactory();
        ThemeApplication app1 = new ThemeApplication(darkFactory);
        app1.renderComponents();
        System.out.println("*******************");

        ThemeFactory lightFactory = new LightThemeFactory();
        ThemeApplication app2 = new ThemeApplication(lightFactory);
        app2.renderComponents();
    }
}

出力:

Successfully render a dark button
Successfully render a dark menu
Successfully render a dark toolbar
*******************
Successfully render a light button
Successfully render a light menu
Successfully render a light toolbar

落とし穴

  • ファクトリ パターンよりも実装が複雑です。
  • 新しい製品を追加するには、抽象ファクトリーと具体ファクトリーの両方の変更が必要です。

工場出荷時パターンとの比較

  • ファクトリ パターンは具体的な製品をクライアント コードから切り離しますが、抽象ファクトリ パターンは具体的な製品だけでなく具体的​​なファクトリも隠します。
  • ファクトリー パターンは、1 つの製品とそのサブクラスで機能します。対照的に、Abstract Factory パターンは、複数の製品が連携して動作することが期待される場合に適しています。

ここですべてのデザイン パターンの実装を確認できます。
GitHub リポジトリ


追伸
技術ブログを書くのは初めてです。文章を改善するためのアドバイスや、わかりにくい点がある場合は、コメントを残してください。
読んでいただきありがとうございます:)

以上が抽象的な工場パターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。