Java Builderモード、分かりましたか?


Builderモード定義
Builderモード中国語はコンストラクタモードと呼ばれ、ジェネレータモードとも呼ばれ、オブジェクト作成型モードに属し、複雑なオブジェクトの構築とその表現を分離し、同じ構築プロセスで異なる表現を作成することができます.コンストラクタ・モードは、複雑なオブジェクトを一歩一歩作成します.これにより、ユーザーは複雑なオブジェクトのタイプと内容を指定するだけで構築できます.ユーザーは内部の具体的な構築の詳細を知る必要はありません.次の図は、コンストラクタ・モードの汎用クラス図です.コンストラクタ・モードには、次の4つのロールがあります.
  • Product:製品ロール
  • Builder:抽象作成者、製品インタフェース
  • を定義
  • ConcreteBuilder:Builder定義のインタフェースを実装し、組み立てられた製品
  • を返します.
  • Director:指揮者、この中のボスに属して、あなたはどんな製品を生産して直接それを探す必要があります.

  • コンストラクタモードの適用例
    家財道具
    家装は精装でも簡略装でも、その流れは相対的に固定されているので、コンストラクタモードに適しています.私たちは家装を例に、建築者モデルを勉強してみましょう.下図は、家装建造者モードの簡単なUML図です.
    1、家装対象類
    /**
     *      
     */
    public class House {
        //    
        private String jiadian;
    
        //    
        private String diban;
        //    
        private String youqi;
    
        public String getJiadian() {
            return jiadian;
        }
    
        public void setJiadian(String jiadian) {
            this.jiadian = jiadian;
        }
    
        public String getDiban() {
            return diban;
        }
    
        public void setDiban(String diban) {
            this.diban = diban;
        }
    
        public String getYouqi() {
            return youqi;
        }
    
        public void setYouqi(String youqi) {
            this.youqi = youqi;
        }
    
        @Override
        public String toString() {
            return "House{" +
                    "jiadian='" + jiadian + '\'' +
                    ", diban='" + diban + '\'' +
                    ", youqi='" + youqi + '\'' +
                    '}';
        }
    }

    2、抽象建造者Builder類
    /**
     *      
     */
    public interface HouseBuilder {
        //    
        void doJiadian();
        //    
        void doDiBan();
        //    
        void doYouqi();
    
        House getHouse();
    }

    3、具体的な建設者-簡易建設者類
    /**
     *      
     */
    public class JianzhuangBuilder implements HouseBuilder {
    
        private House house = new House();
    
        @Override
        public void doJiadian() {
            house.setJiadian("      ");
        }
    
        @Override
        public void doDiBan() {
            house.setDiban("    ");
        }
    
        @Override
        public void doYouqi() {
            house.setYouqi("         ");
        }
    
        @Override
        public House getHouse() {
            return house;
        }
    }
    

    4、具体的な建設者-精装建設者類
    /**
     *      
     */
    public class jingzhuangBuilder implements HouseBuilder {
    
        private House house = new House();
    
        @Override
        public void doJiadian() {
            house.setJiadian("    ,   ");
        }
    
        @Override
        public void doDiBan() {
            house.setDiban("    ,    ");
        }
    
        @Override
        public void doYouqi() {
            house.setYouqi("    ,   0   ");
        }
    
        @Override
        public House getHouse() {
            return house;
        }
    }
    

    5、指揮官-内装会社類
    /**
     *     ,            
     */
    public class HouseDirector {
    
        public House builder(HouseBuilder houseBuilder){
            houseBuilder.doDiBan();
            houseBuilder.doJiadian();
            houseBuilder.doYouqi();
            return houseBuilder.getHouse();
        }
    }

    6、テスト
    public class App {
        public static void main(String[] args) {
            house();
        }
    
        public static void house(){
            HouseDirector houseDirector = new HouseDirector();
            //   
            JianzhuangBuilder jianzhuangBuilder = new JianzhuangBuilder();
            System.out.println("    ");
            System.out.println(houseDirector.builder(jianzhuangBuilder));
    
            //   
            jingzhuangBuilder jingzhuangBuilder = new jingzhuangBuilder();
            System.out.println("    ");
            System.out.println(houseDirector.builder(jingzhuangBuilder));
    
        }
    }

    出力結果
    私たちは家装を例に、2つの具体的な建設者、1つの簡素な建設者、1つの精装建設者を実現しました.私たちは家装会社に伝えるだけで、私は簡単な服が必要ですか、それとも精装が必要ですか.彼は私たちの手配を手伝ってくれます.私は中の具体的な詳細を知る必要はありません.どうですか、建造者モデルは学びましたか.
    オブジェクト構築
    日常開発では、次のコードがよく見られますか.
    
    return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.curry.springbootswagger.controller"))
            .paths(PathSelectors.any())
            .build();

    美しいのではないでしょうか.Builderモードを習得したら、このようにオブジェクト構築を行うこともできます.それは変種のBuilderモードによって実現される.説明はさておき,我々はまずBuilderモードを用いて上述したオブジェクトとの構築を実現し,学生クラスを例に挙げた.
    学生オブジェクトコード:
    public class Student {
    
        private String name;
    
        private int age;
    
        private int num;
    
        private String email;
    
        //       builder  
        public static Student.Builder builder() {
            return new Student.Builder();
        }
        //     builder          。
        public static class Builder{
            private String name;
    
            private int age;
    
            private int num;
    
            private String email;
    
            public Builder name(String name) {
                this.name = name;
                return this;
            }
    
            public Builder age(int age) {
                this.age = age;
                return this;
            }
    
            public Builder num(int num) {
                this.num = num;
                return this;
            }
    
            public Builder email(String email) {
                this.email = email;
                return this;
            }
    
            public Student build() {
                //  builder           
                return new Student(this);
            }
        }
        //       
        private Student(Builder builder) {
            name = builder.name;
            age = builder.age;
            num = builder.num;
            email = builder.email;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", num=" + num +
                    ", email='" + email + '\'' +
                    '}';
        }
    }

    呼び出しコード:
        public static void student(){
            Student student = Student.builder().name("   ").num(1).age(18).email("   @163.com").build();
            System.out.println(student);
        }

    バリエーションBuilderモードには、次の内容が含まれています.
  • 構築するクラスの内部に静的内部クラスBuilder
  • を作成する.
  • 静的内部クラスのパラメータは構築クラスと一致する
  • 構築クラスの構築パラメータは静的内部クラスであり、静的内部クラスの変数を用いて構築クラス
  • に1つずつ付与.
  • 静的内部クラスはパラメータのsetterメソッドを提供し、戻り値は現在のBuilderオブジェクト
  • である.
  • は、最終的に、現在のBuilderオブジェクト
  • であるビルドメソッドを提供するビルドクラスのオブジェクトを構築する.
    この書き方は面倒くさいと言うかもしれませんが、確かに追加のコードをたくさん書く必要があります.先輩たちはlombokを開発して私たちを救ってくれました.私たちはlombokプラグインを導入し、実体クラスに@Builder注釈を追加するだけで、Builderモードでオブジェクトを構築することができます.
    コンストラクタモードのメリットとデメリット
    メリット
  • ビルダーモードでは、クライアントは、製品の内部構成の詳細を知る必要がなく、製品自体を製品の作成プロセスとデカップリングし、同じ作成プロセスが異なる製品オブジェクト
  • を作成できるようにする.
  • 各具体的な建造者は相対的に独立しており、他の具体的な建造者とは無関係であるため、具体的な建造者を置き換えたり、新しい具体的な建造者を追加したりすることが容易であり、ユーザーは異なる具体的な建造者を使用して異なる製品オブジェクト
  • を得ることができる.
  • は、製品の作成プロセスをより細かく制御することができる.複雑な製品の作成手順を異なる方法に分解することで、作成プロセスがより明確になり、プログラムを使用して作成プロセス
  • を制御することが容易になる.
  • 新しい具体的な建造者を増加して元のクラスライブラリのコードを修正する必要はなくて、指揮者クラスは抽象的な建造者クラスに対してプログラミングして、システムの拡張は便利で、“開閉の原則”
  • に合います
    欠点
  • コンストラクタモードで作成された製品は、一般に多くの共通点を有し、その構成部分は類似しており、製品間の差異が大きい場合、コンストラクタモードの使用に適していないため、その使用範囲は一定の制限を受けている.
  • 製品の内部変化が複雑である場合、この変化を実現するために多くの具体的なコンストラクタクラスを定義する必要があり、システムが膨大になる可能性があります.

  • 文章の足りないところは,皆さんが多くの点を指摘し,共に学び,共に進歩することを望んでいる.
    最後に
    小さな広告を打って、コードをスキャンして微信の公衆番号に注目することを歓迎します:“平頭兄の技術の博文”、一緒に進歩しましょう.