2017-07-18 10 views
1

Builderパターンはかなりまっすぐ進むと思われます。私はあなたが複雑なメンバーの種類を持つオブジェクトを構築したいとき、それがどのように動作するかを理解したかったです。ここでBuilderパターンの基本的なタイプの

私は人を構築するためにPersonクラスと静的な内部クラスを持っています。私はPersonBuilder静的ネストされたクラスで定義されていAddressクラスを持っています。理想的には、AddressクラスはPersonクラス自体で定義されている必要があります。コードは機能しますが、ここで正しく動作しているかどうかはわかりません。これらの種類のオブジェクトを構築するより良い方法があれば誰でも助言してください。

class Person{ 

private String firstName; 
private String lastName; 
private Integer age; 
private Person.PersonBuilder.Address address; 

private Person(PersonBuilder builder){ 
    this.firstName = builder.firstName; 
    this.lastName = builder.lastName; 
    this.age = builder.age; 
    this.address = builder.address; 
} 

@Override 
public String toString(){ 
    return "Person: " + 
      this.firstName + "|" + 
      this.lastName + "|" + 
      this.age.toString() + "|" + 
      this.address.aptNum + "|" + 
      this.address.street + "|" + 
      this.address.city + "|" + 
      this.address.state + "|" + 
      this.address.zipCode; 
} 

public static class PersonBuilder{ 

    private String firstName; 
    private String lastName; 
    private Integer age; 
    private Address address; 

    private class Address{ 

     private String aptNum; 
     private String street; 
     private String city; 
     private String state; 
     private Long zipCode; 

     public Address(String aptNum, String street, String city, String state, Long zipCode) { 
      this.aptNum = aptNum; 
      this.street = street; 
      this.city = city; 
      this.state = state; 
      this.zipCode = zipCode; 
     } 
    }  

    public PersonBuilder(String firstName, String lastName){ 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.address = this.new Address("", "", "", "", 0L); 
    } 

    public PersonBuilder age(Integer age){ 
     this.age = age; 
     return this;    
    } 

    public PersonBuilder buildAddress(String aptNum, String street, String city, String state, Long zipCode){ 
     this.address = new Address(aptNum, street, city, state, zipCode); 
     return this; 
    } 

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

}

class Demo { 
    public static void main(String[] args){ 
     Person p1 = new Person.PersonBuilder("XYZ", "XYZ") 
           .age(24) 
           .buildAddress("AB", "XYZ Lane", "ABCtown", 
           "XY", 1234L) 
           .build(); 

       System.out.println(p1.toString()); 
    } 
} 

答えて

0

私は別途パブリッククラスとしてAddressを定義する方が良いだろうと思うので、しっかりPersonと結合することがないであろうと、あなたはそれを再利用することができます。

またAddressのためのビルダーを作成することができます。すべてのフィールドが必要であっても、アドレスの初期化がより簡単になります。

それは次のようになります。

Address a1 = new Address.AddressBuilder() 
        .aptNum("AB") 
        .street("XYZ Lane") 
        .city("ABCtown") 
        .state("XY") 
        .zipCode("1234L") 
        .build(); 
Person p1 = new Person.PersonBuilder("XYZ", "XYZ") 
         .age(24) 
         .address(a1) 
         .build(); 
1

クラスは、単一の主な目的を持っている必要があり、あなたがPersonBuilderに二つの異なるタスクを与えているようだ。人を構築し、アドレスを構築する(上で行われていますPersonインスタンスをビルドしながら飛ぶ)。

前述のように、Addressを独立したクラスにしてAddressBuilderを追加するとよいでしょう。

これは、それが簡単にあなたが独立してPersonAddressクラスを変更するために行います。

Address address = new Adress.AdressBuilder() 
          .aptNum("xyz") 
          .street("xyz") 
          .city("xyz") 
          .state("xyz") 
          .zipCode("xyz") 
          .build(); 

Person person = new Person.PersonBuilder("ABCD", "EFG") 
          .address(address) 
          .build(); 

public PersonBuilder address(Address address){ 
    this.address = address; 
    return this; 
} 

使い方は前の回答で述べた例のようになります。それは単に、すでに構築されAddressインスタンスを受け取ることができるよう

PersonBuilderのアドレスフィールドのセッターも、きれいになります

関連する問題