Builderモード

2657 ワード

Builderモード
@(ブログ記事)[java]
「effetive java」の詳細コードを参照してください.
1つのクラスに多くのプロパティがあり、ほとんどのプロパティが空の場合、このクラスに完全なプロパティリストのコンストラクション関数を提供する場合は、このクラスが呼び出されるときにすべてのパラメータを提供する必要があります.これは非常に面倒です.ほとんどのプロパティは空です.
あるいは、異なる状況に適合する複数のコンストラクション関数を提供することもできますが、これにより、コンストラクション関数が非常に多くなり、これらのコンストラクション関数を呼び出すと、異なるパラメータ(特にこれらのパラメータは同じタイプ)が混同されやすくなります.
Builderモードでは、このクラスのコンストラクション関数ではなく、1つのBuilderクラスでオブジェクトを構築するとともに、デフォルトのプロパティを変更する必要があるさまざまなsetterメソッドで設定するという問題を解決できます.
次の例では、personクラスを例にとると、そのname属性は必須であり、その他はオプションである.以下のコードの出力はljh 511357924610 unkowngz
/**
 * 
 */
package org.ljh.javademo.builderpatter;

/**
 * date: 2016 3 4    4:00:22
 * 
 * @author LUJINHONG [email protected] Function: TODO ADD FUNCTION. last
 *         modified: 2016 3 4    4:00:22
 */

public class Person {
    private final String name;
    private final int age;
    private final int gender;
    private final String phoneNum;
    private final String email;
    private final String city;

    private Person(Builder builder) {
       name = builder.name;
       age = builder.age;
       gender = builder.gender;
       phoneNum = builder.phoneNum;
       email = builder.email;
       city = builder.city;
    }

    //Person        ,    walk(), run(), eat() 。
    public String getMessage(){
        return name + age + gender + phoneNum + email + city; 
    }

    public static class Builder {
        private String name;
        private int age = -1;
        private int gender = 1;
        private String phoneNum = "unkown";
        private String email = "unkown";
        private String city = "unkown";

        public Builder(String name) {
            this.name = name;
        }

        public Person build(){
            return new Person(this);
        }

        public Builder age(int age) {
            this.age = age;
            return this;
        }

        public Builder gender(int gender) {
            this.gender = gender;
            return this;
        }

        public Builder phoneNum(String phoneNum) {
            this.phoneNum = phoneNum;
            return this;
        }

        public Builder email(String email) {
            this.email = email;
            return this;
        }

        public Builder city(String city) {
            this.city = city;
            return this;
        }

    }

    //            ,      ,      demo  。
    public static void main(String[] args){
            Person ljh = new Person.Builder("ljh").age(5).gender(1).phoneNum("13579246810").city("gz").build();
            System.out.println(ljh.getMessage());

    }
}