検索
ホームページJava&#&チュートリアル学習: Java デザイン パターン - ファクトリ パターン

学習: Java デザイン パターン - ファクトリ パターン

Dec 15, 2016 pm 01:35 PM
Javaファクトリーパターン

1. ファクトリ パターンは主にオブジェクトを作成するための遷移インターフェイスを提供し、オブジェクトを作成する特定のプロセスを保護および分離して、柔軟性を向上させるという目的を達成します。



「Java とパターン」では、ファクトリー パターンは次の 3 つのカテゴリに分類されます。
1) 単純なファクトリー パターン (Simple Factory): 一連の製品の生産には役に立たない

2) ファクトリ メソッド パターン (ファクトリー メソッド) ): 多態性ファクトリーと呼ばれます。 )3) 抽象ファクトリー モデル (ABSTRACT Factory): ツールボックスとも呼ばれ、製品ファミリーを生成しますが、より一般的なものではありません。
GOF は、書籍『デザイン パターン』の中で、ファクトリ パターンをファクトリ メソッド パターン (ファクトリ メソッド) と抽象ファクトリ パターン (アブストラクト ファクトリ) の 2 つのカテゴリに分類しています。 Simple Factory パターンは Factory Method パターンの特殊なケースと考えてください。この 2 つは同じカテゴリに分類されます。


2. シンプル ファクトリ パターン

シンプル ファクトリ パターンは、静的ファクトリ メソッド パターンとも呼ばれます。名前の変更から、このモードは非常に単純であることがわかります。その目的は単純で、オブジェクトを作成するためのインターフェイスを定義することです。


単純なファクトリ パターンでは、ファクトリ クラスが製品クラスのインスタンス化呼び出しの中心にあり、通過する車両の流れの中に立って交通警察官が車両を通過させるかどうかを決定するのと同じように、どの製品クラスをインスタンス化するかを決定します。一方向の車両はその方向に流れます。成 まずその構成を見てみましょう:

1) ファクトリーの役割: これはこのモデルの中核であり、特定のビジネス ロジックと判断ロジックが含まれています。 Java では、多くの場合、具象クラスによって実装されます。

2) 抽象的な製品の役割: これは通常、特定の製品または実装されたインターフェイスによって継承される親クラスです。 Javaではインターフェースまたは抽象クラスによって実装されます。


3) 特定の製品ロール: ファクトリ クラスによって作成されたオブジェクトは、このロールのインスタンスです。 Javaの具象クラスによって実装されます。

3. ファクトリ メソッド パターン


ファクトリ メソッド パターンは、シンプル ファクトリ パターンをさらに抽象化し、どの製品クラスをインスタンス化するかを決定するものではなくなりました。抽象ファクトリのサブクラスに渡されます。
その構成を見てみましょう:

1) 抽象ファクトリの役割: これはファクトリ メソッド パターンの中核であり、アプリケーションとは何の関係もありません。これは、特定のファクトリ ロールが実装する必要があるインターフェイス、または継承する必要がある親クラスです。 Java では、抽象クラスまたはインターフェイスによって実装されます。


2) 特定のファクトリ ロール: 特定のビジネス ロジックに関連するコードが含まれています。特定の製品に対応するオブジェクトを作成するためにアプリケーションによって呼び出されます。

3) 抽象的な製品の役割: 特定の製品または実装されたインターフェイスによって継承される親クラスです。 Java では、通常、実装する抽象クラスまたはインターフェイスが存在します。

4) 特定の製品ロール: 特定のファクトリ ロールによって作成されたオブジェクトは、このロールのインスタンスです。 Java の特定のクラスによって実装されます。
ファクトリ メソッド パターンは、Abstract Factory ロールから継承した複数のサブクラスを使用して、Simple Factory パターンの「God クラス」を置き換えます。上で述べたように、これによりオブジェクトへの圧力が共有され、新しい製品 (つまり新興車) が生産されるとき、それが抽象的な製品の役割と抽象的な工場の役割に従って提供される限り、構造がより柔軟になります。コントラクトが生成され、顧客は既存のコードを変更することなく使用できます。工場の役割の構造も開閉原理に準拠していることがわかります。

コード:

//抽象产品角色
public interface Moveable {
    void run();
}
//具体产品角色
public class Plane implements Moveable {
    @Override
    public void run() {
        System.out.println("plane....");
    }
}

public class Broom implements Moveable {
    @Override
    public void run() {
        System.out.println("broom.....");
    }
}


//抽象工厂
public abstract class VehicleFactory {
    abstract Moveable create();
}

//具体工厂
public class PlaneFactory extends VehicleFactory{
    public Moveable create() {
        return new Plane();
    }
}

public class BroomFactory extends VehicleFactory{
    public Moveable create() {
        return new Broom();
    }
}

//测试类
public class Test {
    public static void main(String[] args) {
        VehicleFactory factory = new BroomFactory();
        Moveable m = factory.create();
        m.run();
    }
}


ファクトリーメソッドの追加によりオブジェクトの数が2倍になっていることがわかります。製品の種類が多いと、対応するファクトリーオブジェクトが大量に出現することになり、これは望ましくありません。この状況が避けられない場合は、単純なファクトリ パターンとファクトリ メソッド パターンを組み合わせて使用​​して、ファクトリ クラスを減らすことを検討できます。つまり、製品ツリー上の同様のタイプ (通常は、リーフ間の兄弟) に単純なファクトリを使用します。ツリー) モードを実現します。

4. 単純なファクトリパターンとファクトリメソッドパターンの比較

ファクトリメソッドパターンと単純なファクトリパターンの定義の違いは明らかです。ファクトリ メソッド パターンのコアは、実際のクラスにコアを置く単純なファクトリ パターンとは異なり、抽象ファクトリ クラスです。ファクトリ メソッド パターンを使用すると、多くの実際のファクトリ クラスが抽象ファクトリ クラスから継承できるようになり、実際には複数の単純なファクトリ パターンの合成となるため、単純なファクトリ パターンが普及します。
一方、単純なファクトリ パターンはファクトリ メソッド パターンから退化したものです。システムが実際のファクトリ クラスのみを必要としていると確信している場合、抽象ファクトリ クラスを実際のファクトリ クラスにマージした方がよいと想像してください。このようにして、単純なファクトリーモデルに堕落してしまいました。

5. Abstract Factory パターン

コード:

//抽象工厂类

public abstract class AbstractFactory {
    public abstract Vehicle createVehicle();
    public abstract Weapon createWeapon();
    public abstract Food createFood();
}

//具体工厂类,其中Food,Vehicle,Weapon是抽象类,

public class DefaultFactory extends AbstractFactory{
    @Override
    public Food createFood() {
        return new Apple();
    }
    @Override
    public Vehicle createVehicle() {
        return new Car();
    }
    @Override
    public Weapon createWeapon() {
        return new AK47();
    }
}

//测试类

public class Test {
    public static void main(String[] args) {
        AbstractFactory f = new DefaultFactory();
        Vehicle v = f.createVehicle();
        v.run();
        Weapon w = f.createWeapon();
        w.shoot();
        Food a = f.createFood();
        a.printName();
    }
}

Abstract Factory パターンでは、1 つ以上の抽象製品 (AbstractProduct) が存在し、1 つ以上の製品ファミリー (Product Family) を形成する場合があります。 製品ファミリーが 1 つだけの場合、抽象ファクトリ パターンは実際にはファクトリ メソッド パターンに縮退します。


6. まとめ。

(1) 単純なファクトリ パターンは、特定のクラスを使用して他のクラスのインスタンスを作成します。親クラスは同じであり、親クラスは固有です。
(2) ファクトリ メソッド パターンにはパブリック インターフェイスを定義する抽象親クラスがあり、サブクラスは特定のオブジェクトの生成を担当します。この目的は、クラスのサブクラスへのインスタンス化を遅らせることです。
(3) 抽象ファクトリ パターンは、特定のクラスを指定せずに、一連の関連オブジェクトまたは相互依存オブジェクトを作成するためのインターフェイスを提供します。複数の製品の階層構造を対象としています。ファクトリ メソッド パターンは、製品の階層構造を目的としています。


さらに詳しく学習するには: Java デザイン パターン - ファクトリ パターン関連記事、PHP 中国語 Web サイトに注目してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか?高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか?Mar 17, 2025 pm 05:46 PM

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか?適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか?Mar 17, 2025 pm 05:45 PM

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか?カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか?Mar 17, 2025 pm 05:44 PM

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか?キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか?Mar 17, 2025 pm 05:43 PM

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか?Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか?Mar 17, 2025 pm 05:35 PM

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、