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

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

高洛峰
高洛峰オリジナル
2016-12-15 13:35:571325ブラウズ

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


さらに詳しく学習するには: Java デザイン パターン - ファクトリ パターン関連記事、PHP 中国語 Web サイトに注目してください。

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