ホームページ >Java >&#&チュートリアル >Javaファクトリメソッドパターンの詳細説明

Javaファクトリメソッドパターンの詳細説明

WBOY
WBOY転載
2022-04-02 12:45:374745ブラウズ

この記事では、java に関する関連知識を提供します。主にファクトリ メソッド パターンに関連する問題を紹介します。ファクトリ メソッド パターンは、仮想コンストラクタ パターンまたはポリモーフィック ファクトリ パターンとも呼ばれます。クラス作成モードについて、皆さんのお役に立てれば幸いです。

Javaファクトリメソッドパターンの詳細説明

推奨学習: 「java チュートリアル

1. ファクトリ メソッド パターンとは何ですか?

ファクトリ メソッド パターン: 仮想コンストラクタ パターンまたはポリモーフィック ファクトリ パターンとも呼ばれ、クラス作成パターンに属します。

ファクトリ メソッド パターンでは、ファクトリの親クラスは製品オブジェクトを作成するためのパブリック インターフェイスの定義を担当し、ファクトリのサブクラスは特定の製品オブジェクトの生成を担当します。この目的はインスタンス化することです。製品クラス 操作はファクトリ サブクラスに延期されます。つまり、ファクトリ サブクラスは、どの特定の製品クラスをインスタンス化するかを決定するために使用されます。

今日の実際の工場における分業は、ますます詳細かつ専門化していることがわかっています。 。さまざまな製品が専門工場で生産され、自給自足の小規模農家経済の時代に完全に別れを告げ、製品の生産サイクルが大幅に短縮され、生産効率が向上します。ファクトリ メソッド パターンは、開閉の原則を満たすだけでなく、単純なファクトリ パターンの利点も継承しています。

例:

単純なファクトリ パターン記事の Coke 工場では、ファクトリ クラスが 1 つしかないため、すべての製品をこのクラスで修正および修正する必要があります。調整、工場方式モデルは複数の工場を持ち、各工場で一つの製品を生産するモデルで、新しい製品を追加する必要がある場合は、直接新しい工場を作成でき、他の工場内で変更する必要はありません。それは開閉の原則と一致しています。

2. ファクトリ メソッド パターンの長所と短所

利点:

  • ユーザーは名前だけを知る必要があります。特定の工場 必要な製品を入手するために、製品の具体的な作成プロセスを知る必要はありません

  • 柔軟性の向上 新しい製品の作成には、次のように記述するだけで済みます対応するもう 1 つのファクトリ クラス

  • 典型的なデカップリング フレームワーク。高レベルのモジュールは、製品の抽象クラスのみを知っていればよく、他の実装クラスについて気にする必要はなく、デメテルの法則、依存関係逆転原則、およびリヒター置換原則を満たします

#欠点:

  • クラスが多すぎると複雑さが増します。

  • クラスの抽象化と難易度が高まります。システムを理解する

  • 抽象プロダクトは 1 つのプロダクトしか生成できません。この欠点は、

    Abstract Factory Pattern (Abstract Factory Pattern については次の記事で説明します)## を使用して解決できます。

  • # 3. パターンの構造と実装

構造は次の 4 つの部分で構成されます。

    Abstract Factory:製品を作成するためのインターフェイス、および呼び出し元が渡します。これは、製品を作成するためにコンクリート ファクトリのファクトリ メソッド newProduct() にアクセスします。
  • コンクリート ファクトリ (ConcreteFactory): 主に、抽象ファクトリーと特定の製品の作成を完了します
  • 抽象製品 (製品): 製品の仕様を定義し、製品の主な特徴と機能を説明します
  • #具体的なプロダクト (ConcreteProduct): 抽象的なプロダクトを実装します。 ロールで定義されたインターフェイスは特定のファクトリによって作成され、特定のファクトリと 1 対 1 に対応します。
  • # 構造図:

4. ファクトリ メソッド パターン コードの実装

Javaファクトリメソッドパターンの詳細説明 前回の記事からコーラ工場を取り上げましょう。例として:

製品には、コカ コーラ、ペプシ コーラ、無糖コーラが含まれます。

単純な工場パターンでは、コーラ工場は 1 つだけあり、3 つの製品を生産できます。ファクトリ メソッド パターンでは、対応する製品を生成する複数のファクトリが存在する可能性があります。
抽象ファクトリ:
Cola Factory (メイン ファクトリとして理解できます)

Pepsi-コーラ工場: ペプシコーラの生成
コカコーラ工場: コカコーラの生成
無糖コーラ工場: 無糖コーラの生成
コーラの製造方法:

/**
 *  提供了产品的接口
 */public interface Cola {

    //生产可乐的方法
    public void cola();}

Cola Abstract Factory:

/**
 * 可乐抽象工厂(可以理解成可乐总厂,旗下还有很多分厂)
 */public interface ColaFactory {

    public Cola newCola();}

3 種類のコーラの製造方法:

コーラ Coke:

/**
 * 产品名称:可乐可乐,实现了产品的接口
 */public class CocaCola implements Cola{

    @Override
    public void cola() {
        System.out.println("开始生产可口可乐");
    }}
ペプシ コーラ:
/**
 *
 * 产品名称:百事可乐,实现了产品的接口
 */public class PepsiCola implements Cola{

    @Override
    public void cola() {
        System.out.println("开始生产百事可乐");
    }}

シュガーフリー コーラ:
/*
 * 产品名称:无糖可乐,实现了产品的接口
 */public class SugarFreeCola implements Cola{

    @Override
    public void cola() {
        System.out.println("开始生产无糖可乐");
    }}

3 つの製品が 3 つの工場に対応します:

コカ・コーラを生産する工場:

/**
 *
 * 具体工厂1:可口可乐工厂
 */public class CocaColaFactory implements ColaFactory{
    
    @Override
    public Cola newCola() {
        System.out.println("我是可乐工厂下面的可口可乐工厂");
        return new CocaCola();
    }}
ペプシ・コーラを生産する工場:

/**
 *
 * 具体工厂2:百事可乐工厂
 */public class PepsiColaFactory implements ColaFactory{

    @Override
    public Cola newCola() {
        System.out.println("我是可乐工厂下面的百事可乐工厂");
        return new PepsiCola();
    }}

無糖コーラを生産する工場:

/*
 * 具体工厂3:无糖可乐工厂
 */public class SugarFreeColaFactory implements ColaFactory{
    
    @Override
    public Cola newCola() {
        System.out.println("我是可乐工厂下面的无糖可乐工厂");
        return new SugarFreeCola();
    }}

ここにあります:

コークスの製造方法

  • コークス工場 (小規模な工場が複数あります)以下) 工場)

  • 3 種類のコーラを生産する 3 つの方法 (Coke インターフェイスの実装)

  • 3 つのコーラ工場 (3 種類のコーラを生産する) Coke の、Coke ファクトリー インターフェイスの実装)

  • テスト クラス:
public class Test {
    public static void main(String[] args) {

        try{

            //新建一个可乐方法对象
            Cola a;

            //新建一个可乐工厂对象
            ColaFactory af;

            //告诉可乐工厂,你需要什么可乐,并且通知对应的分工厂
            af = (ColaFactory) new PepsiColaFactory();
            //执行对于生产方法
            a = af.newCola();
            a.cola();
            
        }catch (Exception e ){
            System.out.println(e.getMessage());
        }
    }}

たとえば、今ペプシが必要な場合は、ペプシを渡します。 AF の工場:

我是可乐工厂下面的无糖可乐工厂
开始生产无糖可乐

如果传入CocaColaFactory

我是可乐工厂下面的可口可乐工厂
开始生产可口可乐

5、总结

这就是工厂方法模式,和简单工厂模式有所不同,在这个模式内有一个抽象工厂接口,也就是你需要增加新产品后,不需要在原本的工厂内去修改代码,而是直接新建一个工厂,去实现抽象工厂即可,也是符合了开闭原则。

当然缺点也就是工厂多了,管理变得复杂,也增加了系统的抽象性和理解难度,而且抽象产品只能生产一种产品,但是此弊端可使用抽象工厂模式解决(抽象工厂模式在下一篇文章)

推荐学习:《java教程

以上がJavaファクトリメソッドパターンの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。