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

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

Dec 13, 2016 pm 01:58 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) 抽象ファクトリ パターンは、特定のクラスを指定せずに、一連の関連オブジェクトまたは相互依存オブジェクトを作成するためのインターフェイスを提供します。複数の製品の階層構造を対象としています。ファクトリ メソッド パターンは、製品の階層構造を目的としています。


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

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? 会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? Apr 19, 2025 pm 04:51 PM

一部のアプリケーションが適切に機能しないようにする会社のセキュリティソフトウェアのトラブルシューティングとソリューション。多くの企業は、内部ネットワークセキュリティを確保するためにセキュリティソフトウェアを展開します。 ...

名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? 名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? Apr 19, 2025 pm 11:30 PM

多くのアプリケーションシナリオでソートを実装するために名前を数値に変換するソリューションでは、ユーザーはグループ、特に1つでソートする必要がある場合があります...

MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? Apr 19, 2025 pm 06:21 PM

システムドッキングでのフィールドマッピング処理は、システムドッキングを実行する際に難しい問題に遭遇することがよくあります。システムのインターフェイスフィールドを効果的にマッピングする方法A ...

Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Apr 19, 2025 pm 11:45 PM

intellijideaultimatiateバージョンを使用してスプリングを開始します...

Javaオブジェクトを配列に安全に変換する方法は? Javaオブジェクトを配列に安全に変換する方法は? Apr 19, 2025 pm 11:33 PM

Javaオブジェクトと配列の変換:リスクの詳細な議論と鋳造タイプ変換の正しい方法多くのJava初心者は、オブジェクトのアレイへの変換に遭遇します...

エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? Apr 19, 2025 pm 11:42 PM

データベース操作にMyBatis-Plusまたはその他のORMフレームワークを使用する場合、エンティティクラスの属性名に基づいてクエリ条件を構築する必要があることがよくあります。あなたが毎回手動で...

Redisキャッシュソリューションを使用して、製品ランキングリストの要件を効率的に実現する方法は? Redisキャッシュソリューションを使用して、製品ランキングリストの要件を効率的に実現する方法は? Apr 19, 2025 pm 11:36 PM

Redisキャッシュソリューションは、製品ランキングリストの要件をどのように実現しますか?開発プロセス中に、多くの場合、ランキングの要件に対処する必要があります。

eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? Apr 19, 2025 pm 11:27 PM

eコマースプラットフォーム上のSKUおよびSPUテーブルの設計の詳細な説明この記事では、eコマースプラットフォームでのSKUとSPUのデータベース設計の問題、特にユーザー定義の販売を扱う方法について説明します。

See all articles