デザイン パターン - ファクトリ パターン (単純なファクトリ パターン、ファクトリ メソッド パターン、抽象的なファクトリ パターンを含む)

 関連リンク:

[デザインパターン]列: [デザインパターン]列

関連するサンプル コードをダウンロードできます。  Java の一般的なデザイン パターンの例

序章

現在、ファクトリーモードは大きく分けて以下の3種類があります。

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

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

  3. 抽象的な工場パターン

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

シンプル ファクトリ パターン (シンプル ファクトリ パターン) は、静的ファクトリ メソッド (静的ファクトリ メソッド パターン) パターンとも呼ばれる作成パターンですが、23 の GOF デザイン パターンのいずれにも属しません。単純なファクトリ パターンは、ファクトリ オブジェクトによって作成される製品クラスのインスタンスを決定することです。シンプル ファクトリ パターンは、ファクトリ パターン ファミリの中で最も単純かつ最も実用的なパターンであり、さまざまなファクトリ パターンの特別な実装として理解できます。

効果:

「クラスのインスタンス化」操作を「オブジェクトの使用」操作から分離すると、ユーザーは特定のパラメーターを知らなくても必要な「製品」クラスをインスタンス化できるため、クライアント コードでの明示的な指定が回避され、分離が実現します。

主人公

特定のファクトリー (作成者) の役割

単純なファクトリ パターンの中核。すべてのインスタンスを作成する内部ロジックの実装を担当します。ファクトリ クラスでプロダクト クラスを作成するメソッドは、外部から直接呼び出して、必要なプロダクト オブジェクトを作成できます。

抽象的な製品の役割

単純なファクトリ パターンによって作成されたすべてのオブジェクトの親クラス。すべてのインスタンスによって共有されるパブリック インターフェイスを記述する役割を果たします。

具体的な製品の役割

シンプルなファクトリ パターンの作成目標は、作成されるすべてのオブジェクトが、この役割を果たす特定のクラスのインスタンスであることです。

 

栗を取ります:

さまざまなフレーバーの飲料(抽象的な商品)を呼び出すことができる飲料機械(工場)があり、その3つの飲料(具体的な商品)に対応するボタン(パラメータ)が3つあるとします。このとき、ボタンをクリックして好きなドリンクを選択できます。

抽象的なプロダクト: Product.java

/**
 * 简单工厂模式——抽象产品
 * 说明:
 * 描述产品的公共接口
 *
 */
public abstract class Product {
    /**
     * 产品介绍
     */
    public abstract void introduce();
}

特定の製品: CocoProduct.java、MilkProduct.java、CofficeProduct.java

/**
 * 简单工厂模式——具体产品 A
 *
 * (可以看成是一种饮料:可乐)
 *
 */
public class CocoProduct extends Product{

    @Override
    public void introduce() {
        System.out.println("可乐");
    }
}


/**
 * 简单工厂模式——具体产品 B
 *
 *(可以看成是一种饮料:奶茶)
 *
 */
public class MilkProduct extends Product{

    @Override
    public void introduce() {
        System.out.println("奶茶");
    }
}


/**
 * 简单工厂模式——具体产品 C
 *
 * (可以看成是一种饮料:咖啡)
 *
 */
public class CofficeProduct extends Product{

    @Override
    public void introduce() {
        System.out.println("咖啡");
    }
}

コンクリートファクトリー:SimpleFactory.java

/**
 * 简单工厂模式——具体工厂
 * 
 * 负责实现创建所有实例的内部逻辑,并提供一个外接调用的方法,创建所需的产品对象
 *
 */
public class SimpleFactory {

    /**
     * 提供给外接调用的方法
     * (可以看成是对外提供的三个小按钮)
     *
     * @param type 产品类型
     * @return FactoryPattern.SimpleFactoryPattern.Product
     */
    public static Product getProduct(String type) {
        switch (type) {
            case "coco":
                return new CocoProduct();
            case "milk":
                return new MilkProduct();
            case "coffice":
                return new CofficeProduct();
            default:
                return null;
        }
    }

}

テスト: SimpleFactoryDe​​mo.java

/**
 * 简单工厂模式
 *
 */
public class SimpleFactoryDemo {

    public static void main(String[] args) {
        // 创建具体的工厂
        SimpleFactory factory = new SimpleFactory();
        // 根据传入的参数生产不同的产品实例
        // (按下不同的按钮,获取饮料)
        Product coco = SimpleFactory.getProduct("coco");
        coco.introduce();
        Product milk = SimpleFactory.getProduct("milk");
        milk.introduce();
        Product coffice = SimpleFactory.getProduct("coffice");
        coffice.introduce();
    }

}

 

栗によれば、次のように説明できます。

  • 抽象製品クラスは複数の具体的な製品クラスを派生できます

  • 特定のファクトリ クラス。staticこのファクトリのメソッドにさまざまなパラメータを渡すことによって、さまざまな特定の製品クラスのインスタンスが生成されます。

長所と短所

アドバンテージ

  • 作成と使用の作業を分離し、クラス オブジェクトの作成方法を気にせず、分離を実現します。

  • インスタンスを初期化する作業をファクトリに組み込むことで、コードの保守が容易になります。実装指向のプログラミングではなく、オブジェクト指向の原則とインターフェイス指向のプログラミングに沿ったもの

欠点がある

  • ファクトリ クラスはすべてのインスタンス (プロダクト) の作成ロジックを集中させており、ファクトリが正常に動作しないとシステム全体に影響を及ぼします。

  • 「オープン-クローズ」原則に違反すると、新しい製品が追加されると、ファクトリ クラスのロジックを変更する必要があり、ファクトリ ロジックが複雑になりすぎます。

  • 単純なファクトリ パターンでは静的ファクトリ メソッドが使用され、静的メソッドの継承や書き換えができないため、ファクトリ ロールの形成に失敗します。

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

ファクトリ メソッド パターンは、ファクトリ パターン (ファクトリ パターン) 、ポリモーフィック ファクトリ パターン、および仮想コンストラクタ パターンとも呼ばれ、ファクトリの親クラスを定義することによってオブジェクトを作成するためのパブリック インターフェイスを定義する役割を担い、サブクラスは特定のオブジェクトを生成する役割を担います。 。(よく使われます!)

効果:

クラスのインスタンス化 (特定の製品の作成) は、ファクトリ クラス (具体的なファクトリ) のサブクラスまで遅延されます。つまり、どのクラスがインスタンス化 (作成) されるべきかはサブクラスが決定します。

主人公

抽象的なファクトリーの役割

コンクリート ファクトリのパブリック インターフェイスについて説明します。

コンクリート工場の役割

具体的なファクトリを記述し、外部呼び出し用のプロダクトのインスタンスを作成し、主に抽象ファクトリ内の抽象メソッドを実現して、具体的なプロダクトの作成が完了します。

抽象的な製品の役割

製品のパブリック インターフェイスの説明、製品の仕様の定義、製品の主な特徴と機能の説明を担当します。

具体的な製品の役割

生産される特定の製品を記述し、抽象的な製品ロールによって定義されたインターフェイスを実装し、特定の工場に 1 つずつ対応する特定の工場によって作成されます。

 

栗を取ります:

さまざまな飲料機械(抽象工場)があるとすると、さまざまな飲料(抽象製品)を呼び出すことができます。ただし、ある種類の飲料機械(特定の工場)では 1 種類の飲料(特定の製品)しか製造できません。コーラを飲む必要がある場合は、コーラ飲料マシンを購入する必要があります。

抽象的なプロダクト: Product.java

/**
 * 工厂方法模式——抽象产品
 *
 */
public abstract class Product {
    /**
     * 产品介绍
     */
    public abstract void introduce();
}

特定の製品: ProductA.java、ProductB.java

/**
 * 工厂方法模式——具体产品A
 *
 */
public class ProductA extends Product{
    @Override
    public void introduce() {
        System.out.println("饮料A");
    }
}


/**
 * 工厂方法模式——具体产品B
 *
 */
public class ProductB extends Product{
    @Override
    public void introduce() {
        System.out.println("饮料B");
    }
}

抽象ファクトリー: Factory.java

/**
 * 工厂方法模式——抽象工厂
 *
 */
public abstract class Factory {
    /**
     * 生产产品
     *
     * @return FactoryPattern.FactoryPattern.Product
     */
    public abstract Product getProduct();
}

特定のファクトリ: FactoryA.java、FactoryB.java

/**
 * 工厂方法模式——具体工厂A
 *
 * (负责具体的产品A生产)
 *
 */
public class FactoryA extends Factory{
    @Override
    public Product getProduct() {
        return new ProductA();
    }
}


/**
 * 工厂方法模式——具体工厂B
 *
 * (负责具体的产品B生产)
 *
 */
public class FactoryB extends Factory{
    @Override
    public Product getProduct() {
        return new ProductB();
    }
}

テスト: FactoryDe​​mo.java

/**
 * 工厂方法模式
 *
 */
public class FactoryDemo {

    public static void main(String[] args) {
        // 创建具体的工厂
        FactoryA factoryA = new FactoryA();
        // 生产相对应的产品
        factoryA.getProduct().introduce();
        FactoryB factoryB = new FactoryB();
        factoryB.getProduct().introduce();
    }

}

 

栗によると、次のように説明できます

  • 抽象製品クラスは複数の具体的な製品クラスを派生できます

  • 複数の具体的なファクトリ クラスを派生できる抽象ファクトリ クラス

  • 各具体的なファクトリ クラスは、具体的な製品クラスのインスタンスのみを作成できます。

長所と短所

アドバンテージ

  • 「オープンクローズ原則」に準拠し、高い拡張性を備えています。新しい製品を追加するときは、対応する特定の製品カテゴリと対応する工場サブカテゴリを追加するだけで済みます。

  • 単一責任の原則に従う: 特定の各工場クラスは、対応する製品の作成のみを担当します。

欠点がある

  • システムの複雑さの増加: ペアのクラスの数が増加します。

  • 抽象度が増し、システムの理解が難しくなる

  • 特定の工場では特定の製品しか作ることができない

抽象的な工場パターン

Abstract Factory Pattern(アブストラクト・ファクトリー・パターン)は、スーパーファクトリーの周囲に他のファクトリーを作成するものです。スーパーファクトリーは他の工場の工場としても知られています。このタイプのデザイン パターンは創造的なパターンであり、オブジェクトを作成するための最適な方法を提供します。

Abstract Factory パターンでは、インターフェイスは、クラスを明示的に指定せずに関連オブジェクトを作成する役割を担うファクトリです。生成された各ファクトリは、ファクトリ パターンに従ってオブジェクトを提供できます。

抽象ファクトリ パターンファクトリ メソッド パターン の最大の違いは次のとおりです

  • 抽象的な工場では、各工場が複数の種類の製品を作成できます。
  • ファクトリー方式では、各工場で1種類の製品しか作れません。

効果

抽象インターフェイスを使用すると、実際の具体的な製品が何であるかを知らなくても、気にしなくても、一連の関連製品を作成できるため、具体的な製品から切り離すことができます。

主人公

抽象的なファクトリーの役割

コンクリート ファクトリのパブリック インターフェイスについて説明します

コンクリート工場の役割

特定のファクトリを記述し、外部呼び出し用の製品のインスタンスを作成します。

抽象製品ファミリー (抽象製品) の役割

抽象製品のパブリック インターフェイスについて説明します。

抽象的な製品の役割

特定の製品のパブリック インターフェイスについて説明する

具体的な製品の役割

製造された特定の製品について説明する

 

栗を取ります:

さまざまな種類の食品 (抽象的な製品ファミリー) を販売できるさまざまな種類の自動販売機 (抽象的な工場) があるとします。

一般的な小売自動販売機(具体的な工場)のような飲料や軽食(抽象的な商品)があり、ミネラルウォーターやパン(具体的な商品)が販売されています。

抽象的な製品ファミリー: Product.java

/**
 * 抽象工厂模式——抽象产品族(食品)
 *
 */
public abstract class Product {
    /**
     * 产品介绍
     */
    public abstract void introduce();
}

抽象プロダクト: ProductA.java、ProductB.java

/**
 * 抽象工厂模式——抽象产品(饮料)
 *
 */
public abstract class ProductA extends Product{
}


/**
 * 抽象工厂模式——抽象产品(零食)
 *
 */
public abstract class ProductB extends Product{
}

特定の製品: ProductAa.java、ProductBb.java

/**
 * 抽象工厂模式——具体产品
 *
 */
public class ProductAa extends ProductA{
    @Override
    public void introduce() {
        System.out.println("矿泉水");
    }
}


/**
 * 抽象工厂模式——具体产品
 *
 */
public class ProductBb extends ProductB{
    @Override
    public void introduce() {
        System.out.println("面包");
    }
}

抽象ファクトリー: AbstractFactory.java

/**
 * 抽象工厂模式——抽象工厂
 *
 */
public abstract class AbstractFactory {
    /**
     * 生产饮料
     */
    public abstract Product getProductA();
    /**
     * 生产零食
     */
    public abstract Product getProductB();
}

特定のファクトリ: AbstractFactoryA.java

/**
 * 抽象工厂模式——具体工厂
 *
 * 负责具体的A类产品生产
 *
 */
public class AbstractFactoryA extends AbstractFactory{
    @Override
    public Product getProductA() {
        // 生产矿泉水
        return new ProductAa();
    }

    @Override
    public Product getProductB() {
        // 生产面包
        return new ProductBb();
    }
}

テスト: AbstractFactoryDe​​mo.java

/**
 * 抽象工厂模式
 *
 */
public class AbstractFactoryDemo {

    public static void main(String[] args) {
        // 创建零食售卖机(具体工厂)
        AbstractFactoryA abstractFactoryA = new AbstractFactoryA();
        // 获取矿泉水与面包(具体产品)
        abstractFactoryA.getProductA().introduce();
        abstractFactoryA.getProductB().introduce();
    }

}

 

例によれば、次のように説明できます。

  • 複数の抽象製品クラス。各抽象製品は複数の具体的な製品クラスを派生できます。

  • 複数の具体的なファクトリ クラスを派生できる抽象ファクトリ クラス

  • 特定の各ファクトリ クラスは、特定の製品クラスの複数のインスタンスを作成できます

長所と短所

アドバンテージ

  • カップリングを減らす

  • 「オープンクローズ原則」に準拠

  • 単一責任原則に準拠

  • 静的ファクトリーメソッドを使用する代わりに、継承ベースの階層構造を形成できます。

  • 製品ファミリー内の複数のオブジェクトが連携して動作するように設計されている場合、クライアントは常に同じ製品ファミリーのオブジェクトのみを使用することが保証されます。

欠点がある

  • 新しいタイプの商品を展開するのは難しく、シリーズで特定の商品を追加するには、抽象的な商品にコードを追加し、具体的な商品にコードを追加する必要があります。

結論

1.その他のデザインパターンは【デザインパターン】欄をご覧ください。

2. 関連するサンプルコードをダウンロードできます:  Java の一般的な設計パターンの例

PS: [  Java の一般的なデザイン パターンの例] には、 [デザイン パターン] 列に関連するコードが 含まれています  。以前にダウンロードしたことがある場合は、再度ダウンロードする必要はありません~

上記の内容が間違っている場合、または補足が必要な場合は、さらにアドバイスを求めてください。時間内に更新および修正されます~

コメント大歓迎です〜お褒めいただきありがとうございます〜

おすすめ

転載: blog.csdn.net/pjymyself/article/details/121931718