デザインパターンで、抽象ファクトリパターンとファクトリメソッドパターンの違いをどのように覚えていますか?


答え 1:

工場設計パターン:

  • Creational Design Patternに該当します。Factoryパターンは、オブジェクトの作成が入力タイプを使用する別のクラスによって処理されることを示しています。

利点:

  • 疎結合が可能です。

Factory Design Patternを使用する場合

  • 工場設計パターンは、複数のサブクラスを持つスーパークラスがあり、入力に基づいている場合に使用されます。例:レストランが野菜料理、非野菜料理、イタリア料理を提供する場合VegFood、NonVegFood、およびItalianFoodをスーパークラスがFoodである3つのクラスとして扱います。顧客が「Veg」を要求すると、Factoryメソッドは「VegFood」クラスを返します。

例:

ステップ1:「billPerPerson」と「items」という2つの変数を持つ抽象クラス「Food」を作成します。

 パブリックアブストラクトクラスFood

{
    保護された二重billPerPerson;
    保護されたセットアイテム。

    public Food(double billPerPerson)

    {
        this.billPerPerson = billPerPerson;
        this.items = new HashSet <>();
    }

    public double getBill()

    {
        return billPerPerson;

    }

    public Set getItems()
    {
        返却商品;
    }
}

ステップ2:抽象クラス「Food」を拡張する具象クラスを作成する

パブリッククラスVegFoodはFoodを拡張します
{
    パブリックVegFood()

    {
        super(100);
        items.add( "Idly");
        items.add( "Dosa");
        items.add( "Vada");
    }
}

パブリッククラスNonVegFoodはFoodを拡張します
{
    public NonVegFood()
    {
        super(120);
        items.add( "Biriyani");
        items.add( "チキン65");
    }
}

ステップ3:ファクトリクラスであるFoodServerを作成して、情報に基づいて具体的なオブジェクトを作成します。

パブリッククラスFoodServer

{
    public static Food getFood(String foodType)

    {
        if(foodType.equals( "veg"))
        {
            return new VegFood();
        }
        else if(foodType.equals( "non veg"))
        {
            新しいNonVegFood()を返します。
        }
        そうしないと
        {
            System.out.println( "私たちは提供していません" + foodType);
            nullを返します。
        }
    }
}

ステップ4:食品の種類に基づいて必要な食品を取得するためのメインクラス「顧客」。

パブリッククラスの顧客
{
    public static void main(String [] args)
    {
        Food customer1Food = FoodServer.getFood( "veg");
        System.out.println( "Customer1");
        System.out.println( "Items:" + customer1Food.getItems()。toString());
        System.out.println( "Bill:" + customer1Food.getBill());
        Food customer2Food = FoodServer.getFood( "non veg");
        System.out.println( "Customer1");
        System.out.println( "Items:" + customer2Food.getItems()。toString());
        System.out.println( "Bill:" + customer2Food.getBill());
    }
}

抽象的な工場設計パターン:

  • それは、Creational Design Patternに該当し、具体的なクラスを指定せずに関連オブジェクトまたは依存オブジェクトのファミリーを作成するためのインターフェースを提供します。AbstractFactoryパターンは、入力に基づいて最高のFactoryを返すスーパーファクトリです。ファクトリのファクトリとして機能します。 .Itは、返されるファクトリを知ることからクライアントを抽象化します。

実際の例:

  • 石鹸を製造する大きな工場を考えてみましょう。この工場は石鹸に必要なものをすべて製造するわけではありません。「石鹸バー」、「石鹸ラッパー」などを製造する多くのサブ工場があります。主要な工場によって。

Abstract Factory Design Patternを使用する場合

  • クライアントは、オブジェクトがどのように作成され、どのクラスオブジェクトが作成されるかには依存しません。これは、オブジェクトをクラスのファミリから作成する必要がある場合に役立ちます。

注:わかりにくいかもしれませんので、このページの最後に埋め込んだビデオをご覧ください。

例:

ステップ1:

  • 「コース」と呼ばれるインターフェイスを作成します。
公開インターフェースコース
{
    public String getCourseName();
}

ステップ2:

  • 「コース」インターフェースを実装する具体的なクラスを作成します。
パブリッククラスProgrammingCourseはコースを実装します
{
    @オーバーライド
    public String getCourseName()
    {
       「Java」を返します。
    }
}

パブリッククラスNonProgrammingCourse実装コース
{
    @オーバーライド
    public String getCourseName()
    {
        「DSP」を返します。
    }
}

ステップ3:

  • 「ソース」というインターフェイスを作成します。
パブリックインターフェイスSource
{
    public String getSourceName();
}

ステップ4:

  • 「ソース」インターフェイスを実装する具体的なクラスを作成します。
パブリッククラスOfflineはSourceを実装します
{
    @オーバーライド
    public String getSourceName()
    {
        「本」を返す;
    }
}

パブリッククラスOnlineはSourceを実装します
{
    @オーバーライド
    public String getSourceName()
    {
        「YouTube」を返す;
    }
}

ステップ5:

  • 抽象クラス「SourceCourseFactory」を作成します。
パブリック抽象クラスSourceCourseFactory
{
    public abstract Source getSource(String sourceType);
    
    public abstract Course getCourse(String courseType);
}

ステップ6:

  • 「SourceCourseFactory」を拡張するFactoryクラス「CourseFactory」を作成します
パブリッククラスCourseFactoryはSourceCourseFactoryを拡張します
{
    @オーバーライド
    public Source getSource(String sourceType)
    {
        nullを返します。
    }

    @オーバーライド
    公開コースgetCourse(String courseType)
    {
        if(courseType.equalsIgnoreCase( "programming"))
        {
            新しいProgrammingCourse()を返します;
        }
        else if(courseType.equalsIgnoreCase( "non programming"))
        {
            新しいNonProgrammingCourse()を返します。
        }
        そうしないと
        {
            nullを返します。
        }
    }
}

ステップ7:

  • 「SourceCourseFactory」を拡張するFactoryクラス「SourceFactory」を作成します
パブリッククラスSourceFactoryはSourceCourseFactoryを拡張します
{

    @オーバーライド
    public Source getSource(String sourceType)
    {
        if(sourceType.equalsIgnoreCase( "online"))
        {
            新しいOnline()を返す;
        }
        else if(sourceType.equalsIgnoreCase( "offline"))
        {
            新しいOffline()を返します。
        }
        そうしないと
        {
            nullを返します。
        }
    }

    @オーバーライド
    パブリックコースgetCourse(String courseType)
    {
       nullを返します。
    }
    
}

ステップ8:

  • Abstract Factoryクラスを呼び出して実際のFactoryクラスオブジェクトを取得するメインクラスを作成し、そのオブジェクトを使用して他の操作を実行します。
 パブリッククラスExampleMain
{
    public static void main(String [] args)
    {
        SourceCourseFactoryコース= FactoryCreator.getSourceCourseFactory( "course");

        System.out.println(course.getCourse( "programming")。getCourseName());

        SourceCourseFactory source = FactoryCreator.getSourceCourseFactory( "source");
        System.out.println(source.getSource( "online")。getSourceName());

    }
}