「Javaデザインパターン」に関する注記-第6章抽象ファクトリパターン

ステートメント:

このブログは、「Javaデザインパターン」を勉強した後の私のメモです。レビューとレビューを容易にすることを目的としており、商用目的ではありません。

このブログはソースを示しています。侵害がある場合は、すぐに通知して削除してください。

1.抽象ファクトリの説明

  • 定義:抽象ファクトリパターンは、一連の関連オブジェクトまたは相互依存オブジェクトを作成するためのインターフェイスを提供します
  • 特定のクラスを指定する必要はありません
  • タイプ:作成
  • 該当シーン
    • クライアント(アプリケーション層)は、製品クラスインスタンスの作成方法と実装方法の詳細に依存しません
    • 一連の関連する製品オブジェクト(同じ製品ファミリに属する​​)を一緒に使用して、多くの反復コードを必要とするオブジェクトを作成することを強調します
    • 製品クラスライブラリを提供すると、すべての製品が同じインターフェイスで表示されるため、クライアントは特定の実装に依存しません。
  • 利点
    • 特定の製品はアプリケーション層コードで分離されているため、作成の詳細を気にする必要はありません。
    • 一連の製品ファミリを統合して作成する
  • 不利益
    • 作成される可能性のあるすべての製品セットを指定します。製品ファミリで新製品を拡張することは困難であり、抽象ファクトリのインターフェイスを変更する必要があります。
    • システムの抽象化と理解の難しさが増した

製品階層と製品ファミリの違い:

ここに画像の説明を挿入

ファクトリメソッドパターンは製品階層を対象としていますが、抽象メソッドパターンは製品ファミリを対象としています。

理論的には、ファクトリが異なる製品階層に属する製品ファミリ内のすべてのオブジェクトを作成できる場合、現時点では、抽象ファクトリパターンはファクトリメソッドパターンよりも単純で効率的です。

ここに画像の説明を挿入

2.抽象ファクトリコーディング

ビジネスシナリオは前の章のファクトリメソッドと同じであり、新しい要件が提案されています。各コースには、ビデオだけでなく、対応するメモも含まれている必要があります。

ファクトリメソッドを使用して拡張する場合、現時点では、Java手書きクラス、Python手書きクラス、手書き抽象クラス、手書きファクトリ、Java手書きファクトリ、Python手書きファクトリの両方が必要です。現時点では、FEのファクトリはハンドブックは爆発のような現象を起こしやすいです。

ここで、抽象ファクトリを使用して、同じ製品ファミリ製品を一緒に作成します。

  1. コースとメモの抽象クラスを作成する

    public abstract class Video {
          
          
        public abstract void produce();
    }
    
    public abstract class Article {
          
          
        public abstract void produce();
    }
    
  2. コースファクトリインターフェイスを作成する

    public interface CourseFactory {
          
          
        Video getVideo();
    
        Article getArticle();
    }
    
  3. Javaコースクラスとノートクラスを作成する

    public class JavaVideo extends Video {
          
          
        @Override
        public void produce() {
          
          
            System.out.println("录制Java课程视频");
        }
    }
    
    public class JavaArticle extends Article {
          
          
        @Override
        public void produce() {
          
          
            System.out.println("编写Java课程手记");
        }
    }
    
  4. Java製品ファミリを作成するためのコースファクトリ

    public class JavaCourseFactory implements CourseFactory {
          
          
        @Override
        public Video getVideo() {
          
          
            return new JavaVideo();
        }
    
        @Override
        public Article getArticle() {
          
          
            return new JavaArticle();
        }
    }
    
  5. テストクラス

    public class Test {
          
          
        public static void main(String[] args) {
          
          
            CourseFactory courseFactory = new JavaCourseFactory();
            Video video = courseFactory.getVideo();
            Article article = courseFactory.getArticle();
            video.produce();
            article.produce();
        }
    }
    

    演算結果:

    录制Java课程视频
    编写Java课程手记
    
  6. Python製品ファミリーを拡張します

    public class PythonVedio extends Video {
          
          
        @Override
        public void produce() {
          
          
            System.out.println("录制Python课程视频");
        }
    }
    
    public class PythonArticle extends Article {
          
          
        @Override
        public void produce() {
          
          
            System.out.println("编写Python课程手记");
        }
    }
    
    public class PythonCourseFactory implements CourseFactory {
          
          
        @Override
        public Video getVideo() {
          
          
            return new PythonVedio();
        }
    
        @Override
        public Article getArticle() {
          
          
            return new PythonArticle();
        }
    }
    

クラス図は次のようになります。

ここに画像の説明を挿入

抽象ファクトリとファクトリメソッドの比較:

  • 利点:抽象ファクトリモデルは、作成する一連の製品ファミリを統合します。これは、ファクトリメソッドモデルよりも単純で効率的です。
  • 短所:製品ファミリで新製品を拡張することは困難であり、抽象ファクトリのインターフェイスを変更する必要があります。たとえば、今すぐソースコード製品を追加する場合は、CourseFactoryインターフェイスを変更するだけでなく、すべての実装クラスも変更する必要があります。これは、オープンとクローズの原則に違反します。

おすすめ

転載: blog.csdn.net/bm1998/article/details/113092847