JAva設計モード学習の工場モードと抽象工場モード

10526 ワード

1.工場モデル
1.1紹介1.1.1コンセプトファクトリモデル(Factory Pattern)はJavaで最もよく使われる設計モデルの一つである.このタイプの設計モードは、オブジェクトを作成するための最適な方法を提供する作成モードに属します.ファクトリモードでは、オブジェクトを作成するときにクライアントに作成ロジックを露出させず、共通のインタフェースを使用して新しく作成したオブジェクトを指します.1.1.2生活化例えば、私たちはスーパーに買い物に行って、お客様として、私たちは商品がどこから来たのかに注目する必要はありません.スーパーに荷物があれば、私たちは購入することができます.ここのスーパーは工場モデルの工場に相当し、商品を管理するために使用されます.1.1.3メリットとデメリット:1、呼び出し元がオブジェクトを作成したい場合は、その名前を知っていればよい.2、拡張性が高く、製品を1つ増やしたいなら、工場クラスを1つ拡張すればいい.3、製品の具体的な実現を遮断し、呼び出し者は製品のインタフェースだけに関心を持つ.欠点:製品を1つ増加するたびに、特定のクラスと対象実現工場を増加させ、システム中のクラスの個数を2倍に増加させ、ある程度システムの複雑さを増加させ、同時にシステムの具体的なクラスの依存を増加させる必要がある.これはいいことではない.使用シーン:1、ログレコーダ:ローカルハードディスク、システムイベント、リモートサーバなどに記録可能で、ユーザーはログをどこに記録するかを選択できます.2、データベースアクセス、ユーザーが最後のシステムがどの種類のデータベースを採用するか、データベースが変化する可能性があるか分からない場合.3、サーバーを接続するフレームワークを設計するには、3つのプロトコルが必要で、「POP 3」、「IMAP」、「HTTP」は、この3つを製品クラスとして、共通に1つのインタフェースを実現することができる.注意:クラス作成モードとして、複雑なオブジェクトを生成する必要がある場所では、ファクトリメソッドモードを使用できます.複雑なオブジェクトはファクトリモードを使用するのに適しており、単純なオブジェクト、特にnewだけで作成できるオブジェクトは、ファクトリモードを使用する必要はありません.ファクトリモードを使用する場合は、ファクトリクラスを導入する必要があり、システムの複雑さが増加します.1.2.コード化1.2.1普通工場モデルはまず商品の共通インタフェースを作成する:
package com.tl.skyLine.pattern.FactoryPattern;

/**
 * Created by tl on 17/3/8.
 *       
 */
public interface Product {
    //           
    public void explain();
}

次に、商品実装類、石鹸SoapとシャンプーShampooを作成します.
package com.tl.skyLine.pattern.FactoryPattern;

/**
 * Created by tl on 17/3/8.
 */
public class Soap implements Product {
    @Override
    public void explain() {
        System.out.println("        !");
    }
}
package com.tl.skyLine.pattern.FactoryPattern;

/**
 * Created by tl on 17/3/8.
 */
public class Shampoo implements Product {
    @Override
    public void explain() {
        System.out.println("         !");
    }
}

最後に、工場類、つまりスーパーを建てます.
package com.tl.skyLine.pattern.FactoryPattern;

/**
 * Created by tl on 17/3/8.
 */
public class Supermarket {

    public Product sell(String name) {
        if ("soap".equals(name)) {
            return new Soap();
        } else if ("shampoo".equals(name)) {
            return new Shampoo();
        } else {
            System.out.println("           !");
            return null;
        }
    }
}

テストしてみましょう
package com.tl.skyLine.pattern.FactoryPattern;

/**
 * Created by tl on 17/3/8.
 */
public class FactoryTest {
    public static void main(String[] args) {
        Supermarket market = new Supermarket();
        Product sender = market.sell("soap");
        sender.explain();
    }
}

出力:私は舒肌佳牌石鹸です!1.2.2複数のファクトリメソッドモードは、通常のファクトリメソッドモードの改良であり、通常のファクトリメソッドモードでは、伝達された文字列が間違っている場合、オブジェクトを正しく作成することはできませんが、複数のファクトリメソッドモードは、それぞれオブジェクトを作成する複数のファクトリメソッドを提供することです.スーパーを修理しましょう.
public class Supermarket {

    public Product sellSoap() {
        return new Soap();
    }

    public Product sellShampoo() {
        return new Shampoo();
    }
}

テストクラスは次のとおりです.
public class FactoryTest {
    public static void main(String[] args) {
        Supermarket market = new Supermarket();
        Product sender = market.sellSoap();
        sender.explain();
    }
}

出力:私は舒肌佳牌石鹸です!1.2.3スタティックファクトリメソッドモード上記の複数のファクトリメソッドモードのメソッドをスタティックにし、インスタンスを作成する必要がなく、直接呼び出すことができます.
public class Supermarket {

    public static Product sellSoap() {
        return new Soap();
    }

    public static Product sellShampoo() {
        return new Shampoo();
    }
}
public class FactoryTest {
    public static void main(String[] args) {
        Product sender = Supermarket.sellSoap();
        sender.explain();
    }
}

出力:私は舒肌佳牌石鹸です!まとめ:共通インタフェース(属性)を持つオブジェクト(商品)が多数ある場合、工場メソッドモード(スーパー)で作成できます.以上の3つのモードのうち、1つ目は文字列が間違っていれば、正しくオブジェクトを作成できません.3つ目は2つ目に対して、インスタンス化工場クラスは必要ありません.そのため、多くの場合、3つ目の静的工場法モデルを選択します.
2.抽象工場モデル
2.1工場方法モデルを紹介する一つの問題は、クラスの作成が工場クラスに依存することである.つまり、プログラムを拡張するには、工場クラスを修正しなければならない.これは閉鎖原則に反している.だから、設計の観点から、一定の問題があり、どのように解決するか.抽象ファクトリモードを使用して、複数のファクトリクラスを作成します.これにより、新しい機能を追加する必要があれば、新しいファクトリクラスを直接追加すればいいので、前のコードを変更する必要はありません.抽象ファクトリモード(Abstract Factory Pattern)は、スーパーファクトリを中心に他のファクトリを作成します.このスーパー工場は他の工場の工場とも呼ばれている.2.2生活化もしすべてのスーパーマーケットがただ1种の商品だけを売るならば、例えばAスーパーマーケットは石鹸だけを売って、Bスーパーマーケットはシャンプーだけを売って、もし私达が洗顔料を買いに行きたいならば、どうすれば、それでは1家の洗顔料だけを売るスーパーマーケットCを探すしかなくて、すべての抽象的な工場のモードは商品を売るスーパーマーケットを公共のインターフェースを抽出して、いわゆる工場の工場です.2.3コード化石鹸SoapとシャンプーShampooインスタンスは変わらず、スーパー抽象インタフェースを作成する:
package com.tl.skyLine.pattern.FactoryPattern;

/**
 * Created by tl on 17/3/8.
 */
public interface SuperMarket {
    public Product sell();
}

石鹸を売っているスーパー:
package com.tl.skyLine.pattern.FactoryPattern;

/**
 * Created by tl on 17/3/8.
 */
public class SoapMarket implements SuperMarket {

    @Override
    public Product sell() {
        return new Soap();
    }
}

シャンプーを売っているスーパー:
package com.tl.skyLine.pattern.FactoryPattern;

/**
 * Created by tl on 17/3/8.
 */
public class ShampooMarket implements SuperMarket {

    @Override
    public Product sell() {
        return new Shampoo();
    }
}

テスト:
public class FactoryTest {
    public static void main(String[] args) {
        SuperMarket market = new SoapMarket();
        Product product = market.sell();
        product.explain();
    }
}

このように、私たちが商品の種類を拡張するときは、パッケージされたスーパーのインタフェースを修正する必要はありません.新しいスーパーを通じて新しい商品を売ることができます.(ここでは設計モード開閉の原則に基づいて仮定した生活例のみ)
3.違い
工場方法モデルと抽象工場モデルの最大の違いは、工場方法モデルでは、工場が製品(コードのスーパークラス)を創造し、抽象工場モデルでは、工場が製品族(コードのスーパークラスの接続口)を創造することである.