Javaデザインモード——Builderモード


概要
Builderモード:複雑なオブジェクトの構築をその表現から分離し、同じ構築プロセスで異なる表現を作成できます.
シーンの操作
  • 同じ方法、異なる実行順序、異なるイベント結果
  • を生成する.
  • 複数の部品または部品は、いずれも1つのオブジェクトに組み立てることができるが、結果として
  • とは異なる.
  • 製品クラスは非常に複雑であるか、または製品クラスにおける呼び出し順序が異なることによって異なる役割を果たす
  • .
  • 当初は、パラメータが多く、多くのパラメータがデフォルト値を有する場合の
  • など、オブジェクトが複雑に初期化する.
    次に、1つのPerson例からオーバーラップコンストラクタモード、JavaBeansモード、Builderモードの使用を解析する.Personクラスには2つの必要なパラメータ(idとname)があり、5つのオプションパラメータ(age,sex,phone,address,desc)があります.
    オーバーラップコンストラクタモード
    このモードでは、必要なパラメータしかない最初のコンストラクタを提供します.2番目のコンストラクタにはオプションパラメータがあり、3番目には2つのオプションパラメータがあります.このように、最後のコンストラクタにはすべてのオプションパラメータが含まれています.プログラミングの実装を見てみましょう.
    /**
     *          
     */
    public class Person {
        //    
        private final int id;
        private final String name;
        //    
        private final int age;
        private final String sex;
        private final String phone;
        private final String address;
        private final String desc;
    
        public Person(int id, String name) {
            this(id, name, 0);
        }
    
        public Person(int id, String name, int age) {
            this(id, name, age, "");
        }
    
        public Person(int id, String name, int age, String sex) {
            this(id, name, age, sex, "");
        }
    
        public Person(int id, String name, int age, String sex, String phone) {
            this(id, name, age, sex, phone, "");
        }
    
        public Person(int id, String name, int age, String sex, String phone, String address) {
            this(id, name, age, sex, phone, address, "");
        }
    
        public Person(int id, String name, int age, String sex, String phone, String address, String desc) {
            this.id = id;
            this.name = name;
            this.age = age;
            this.sex = sex;
            this.phone = phone;
            this.address = address;
            this.desc = desc;
        }
    }

    上記のコードから、インスタンスを作成する場合は、パラメータリストの最も短いコンストラクタを使用しますが、このリストには設定するすべてのパラメータが含まれています.
    Person person = new Persion(1, "  ", 20, " ", "18800000000", "China", "           ");

    オーバーラップコンストラクタは実行できますが、多くのパラメータがある場合、使用コードを作成するのは難しく、読みにくいです.
    JavaBeansモード
    Javabeanの書き方を採用して、属性のsetterの方法をたくさん書いて、オブジェクトを生成することを通じて、後にsetterの方法を呼び出して属性に値を割り当てさせます.
    /**
     *   JavaBeans  
     */
    public class Person {
        //    
        private int id;
        private String name;
        //    
        private int age;
        private String sex;
        private String phone;
        private String address;
        private String desc;
    
        public void setId(int id) {
            this.id = id;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public void setPhone(String phone) {
            this.phone = phone;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        public void setDesc(String desc) {
            this.desc = desc;
        }
    }

    このモードはオーバーラップコンストラクタモードの不足を補う.インスタンスの作成は簡単です.これにより、コードの読み取りも容易になります.
    Person person = new Person();
    person.setId(1);
    person.setName("  ");
    person.setAge(20);
    person.setSex(" ");
    person.setPhone("18800000000");
    person.setAddress("China");
    person.setDesc("    JavaBeans  ");

    JavaBeansモードは、コンストラクション・プロシージャがいくつかの呼び出しに分割されているため、コンストラクション・プロシージャでJavaBeanが一致しない可能性があります.クラスは、コンストラクタパラメータの有効性を検証するだけで一貫性を保証することはできません.
    Builderモード
    Builderモードは、オーバーラップコンストラクタのような安全性を保証するとともに、JavaBeanモードのような可読性を実現します.
    /**
     *   Builder  
     */
    public class Person {
        //    
        private final int id;
        private final String name;
        //    
        private final int age;
        private final String sex;
        private final String phone;
        private final String address;
        private final String desc;
    
        private Person(Builder builder) {
            this.id = builder.id;
            this.name = builder.name;
            this.age = builder.age;
            this.sex = builder.sex;
            this.phone = builder.phone;
            this.address = builder.address;
            this.desc = builder.desc;
        }
    
        public static class Builder {
            //    
            private final int id;
            private final String name;
            //    
            private int age;
            private String sex;
            private String phone;
            private String address;
            private String desc;
    
            public Builder(int id, String name) {
                this.id = id;
                this.name = name;
            }
    
            public Builder age(int val) {
                this.age = val;
                return this;
            }
    
            public Builder sex(String val) {
                this.sex = val;
                return this;
            }
    
            public Builder phone(String val) {
                this.phone = val;
                return this;
            }
    
            public Builder address(String val) {
                this.address = val;
                return this;
            }
    
            public Builder desc(String val) {
                this.desc = val;
                return this;
            }
    
            public Person build() {
                return new Person(this);
            }
        }
    }

    Personは可変であり,すべてのデフォルトパラメータ値は単独で1つの場所に置かれている.builderのsetterメソッドはbuilder自体を返し、チェーン呼び出しが可能になります.次に、クライアント使用コードを示します.
    Person person = new Person.Builder(1, "  ")
                    .age(18).sex(" ").desc("    builder  ").build();

    AndroidソースのBuilderモード
  • AlertDialogソース
  • Universal-Image-Loaderギャラリー
  • OkHttpのRequestソース
  • …………

  • まとめ
    Builderモードは、通常、構成クラスのコンストラクタとして構成の構築と表示を分離し、ターゲットクラスから構成を分離し、過剰なsetterメソッドを回避します.
    メリット:
  • は良好なパッケージ性を有し、構築者モードを使用することで、クライアントが製品内部の構成の詳細を知らない
  • に比べて、
  • 建造者は独立していて、拡張しやすい(抽象--インタフェース、抽象クラスを通じて)
  • 欠点:
  • は、余分なBuilderオブジェクトおよびDirectorオブジェクトを生成し、メモリ
  • を消費する.
    DirectorはBuilderの組み立てに使用します