コミック:「抽象ファクトリーモデル」とは?

著者|シャオフイ

ソース|プログラマXiaohui(ID:chengxuyuanxiaohui)

いわゆる「ファクトリー・パターン」は、単純なファクトリー・パターン、ファクトリー・メソッド・パターン、および抽象ファクトリー・パターンの3つの一般的な設計パターンの総称です。

コミックの前号では、シンプルファクトリーモデルとファクトリーメソッドモデルの特徴とアプリケーションシナリオを紹介しました。まだ読んでいない人は、この記事を読むことができます:コミック:デザインパターンの「ファクトリーモデル」

今号では、Springフレームワークでの抽象ファクトリパターンとファクトリパターンのアプリケーションを紹介します。

たとえば、企業はマスク、防毒マスク、防護服の3つの製品を作成する必要があり、各製品にはハイエンドとローエンドの2つのカテゴリがあります。ファクトリーメソッドモデルのソリューションによると、作成する必要があるカテゴリは次のとおりです。

同図に示すように、各製品カテゴリーは工場カテゴリーに対応しており、製品数が多いと工場カテゴリーが古くなり、システムが非常に複雑になります。

現時点では何をすべきですか?

最初に製品クラスのコードを見てください。マスクと防護服は2つの抽象的なインターフェースであり、それぞれハイエンドとローエンドの実装クラスがあります。

public interface IMask {
    void showMask();
}

public class LowEndMask implements IMask {
    @Override
    public void showMask(){
        System.out.println("我的低端口罩");
    }
}

public class HighEndMask implements IMask {
    @Override
    public void showMask() {
        System.out.println("我是高端口罩");
    }
}

public interface IProtectiveSuit {
    void showSuit();
}

public class LowEndProtectiveSuit implements IProtectiveSuit {
    @Override
    public void showSuit() {
        System.out.println("我是低端防护服");
    }
}

public class HighEndProtectiveSuit implements IProtectiveSuit {
    @Override
    public void showSuit() {
        System.out.println("我是高端防护服");
    }
}

次はファクトリカテゴリです。製品はハイエンドグループとローエンドグループに分けられるため、工場もハイエンド工場とローエンド工場に分けられ、それぞれがグループ内の製品の作成を担当します。

public interface IFactory {
    //创建口罩
    IMask createMask();
    //创建防护服
    IProtectiveSuit createSuit();
}

public class LowEndFactory implements IFactory {
    @Override
    public IMask createMask() {
        IMask mask =  new LowEndMask();
        // .....
        //  LowEndMask的100行初始化代码
        return mask;
    }

    @Override
    public IProtectiveSuit createSuit() {
        IProtectiveSuit suit =  new LowEndProtectiveSuit();
        // .....
        //  LowEndProtectiveSuit的100行初始化代码
        return suit;
    }
}

public class HighEndFactory implements IFactory {
    @Override
    public IMask createMask() {
        IMask mask =  new HighEndMask();
        // .....
        // HighEndMask的100行初始化代码
        return mask;
    }

    @Override
    public IProtectiveSuit createSuit() {
        IProtectiveSuit suit =  new HighEndProtectiveSuit();
        // .....
        //  HighEndProtectiveSuit的100行初始化代码
        return suit;
    }
}

最後に、クライアントコードは、さまざまなファクトリサブクラスをインスタンス化し、さまざまな作成メソッドを呼び出すことによって、さまざまな製品を作成できます。

public class Test {

    public static void main(String[] args) {
        IFactory factoryA = new LowEndFactory();
        IFactory factoryB = new HighEndFactory();
        //创建低端口罩
        IMask maskA = factoryA.createMask();
        //创建高端口罩
        IMask maskB = factoryB.createMask();
        //创建低端防护服
        IProtectiveSuit suitA = factoryA.createSuit();
        //创建高端防护服
        IProtectiveSuit suitB = factoryB.createSuit();

        maskA.showMask();
        maskB.showMask();
        suitA.showSuit();
        suitB.showSuit();
    }
}

単純なファクトリパターン:

単純なファクトリモデルには一意のファクトリクラスがあり、ファクトリクラスの作成メソッドは、渡されるパラメータに基づいてif-else条件判断を行い、どの製品オ​​ブジェクトが作成されるかを決定します。

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

ファクトリー・メソッド・パターンは、複数のファクトリー・クラスによってファクトリー・インターフェースを実装し、ポリモーフィズムを使用してさまざまな製品オブジェクトを作成することにより、長いif-else条件判断を回避します。

抽象ファクトリパターン:

抽象ファクトリパターンは製品サブカテゴリをグループ化し、同じグループ内の異なる製品は同じファクトリサブカテゴリの異なる方法で作成されるため、ファクトリサブカテゴリの数が減ります。


Springフレームワークに慣れている友達は、Springの重要な機能である依存性注入(DI)を知っている必要があります。

Springの依存性注入により、開発者はBeanオブジェクトをビジネスコードで手動でインスタンス化する必要も、ファクトリクラスを知る必要もありません。

Beanオブジェクトの作成から破棄までのプロセス全体は、Springコンテナによって完全に管理されます。ユーザーが行う必要があるのは、XML構成ファイルでBeanのさまざまな属性を設定する(または注釈を使用する)だけです。

<bean id="userController" class="com.xiaohui.controller.UserController">
    <constructor-arg name="userService" ref="userService"></constructor-arg>
</bean>

<bean id="userService" class="com.xiaohui.service.UserService">

上記の構成によれば、Springコンテナは動的にUserControllerオブジェクトを作成し、UserControllerが依存するUserServiceオブジェクトを作成します。

開発者がBeanオブジェクトuserServiceの実装クラスを別のクラスに変更したい場合は、コードを変更する必要はありません。構成ファイルで対応するBeanのクラス属性を変更するだけです。

ほとんどの場合、newキーワードを使用してオブジェクトを作成します。オブジェクトが属するクラスはコードで明確に定義されています。

ただし、場合によっては、Javaリフレクションを使用するプログラムの実行中にオブジェクトを動的に作成するために、クラスのメタ情報(完全なクラス名など)を使用する必要があります。

Spring構成ファイルで対応するBeanを構成してプロジェクトを開始すると、Springはxml構成ファイルを解析し、Beanのさまざまなライフサイクルに従ってSpringの「ファクトリー」からBeanオブジェクトを作成します。

Springの依存性注入の原理に興味のある友人は、Springのソースコードと関連する実装クラスのBeanFactoryインターフェースを読むことができます。


更多精彩推荐
☞没有 5G 版 iPhone 的苹果秋季发布会,发布了些什么?
☞对话阿里云李飞飞:云原生数据库的时代来了
☞IT 往事录:苹果 Mac 之父,却在 Mac 问世前黯然退场
☞B 站神曲damedane:精髓在于换脸,五分钟就能学会
☞可怕!公司部署了一个东西,悄悄盯着你……
☞极简椭圆曲线密码学入门
点分享点点赞点在看

おすすめ

転載: blog.csdn.net/csdnnews/article/details/108633605