2016-03-27 6 views
-1

次のスニペットは、Javaで基本的なビルダーパターンを実装する方法を示しています。Javaでのビルダーパターンの継承方法

public class User { 
private final String firstName; // required 
private final String lastName; // required 
private final int age; // optional 
private final String phone; // optional 
private final String address; // optional 

private User(UserBuilder builder) { 
    this.firstName = builder.firstName; 
    this.lastName = builder.lastName; 
    this.age = builder.age; 
    this.phone = builder.phone; 
    this.address = builder.address; 
} 

public String getFirstName() { 
    return firstName; 
} 

public String getLastName() { 
    return lastName; 
} 

public int getAge() { 
    return age; 
} 

public String getPhone() { 
    return phone; 
} 

public String getAddress() { 
    return address; 
} 

public static class UserBuilder { 
    private final String firstName; 
    private final String lastName; 
    private int age; 
    private String phone; 
    private String address; 

    public UserBuilder(String firstName, String lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

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

    public UserBuilder phone(String phone) { 
     this.phone = phone; 
     return this; 
    } 

    public UserBuilder address(String address) { 
     this.address = address; 
     return this; 
    } 

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

} 

Q:私は、同じスーパー(スーパークラスとして抽象的/非抽象スーパーユーザのように、そしてユーザーA、ユーザーB、よびUserCはそれを拡張する)クラスで、Userクラスの一つのモデル、より多くを持っている場合、 どのようにすることができます各クラスの特定のビルダーを追加するよりも、少ないコードでビルダーを実装、私はサブクラスのすべてのための1つのビルダーを作成したい

Thnaks

+1

私はメインビルダーに基づいて、各サブクラスのための内部クラスを書くことをお勧めして、内側のビルダー – Andrew

+0

にアクセスするには、その後にすべてのフィールドを変更する必要があり、静的メソッドを作成するには、パブリックにアクセスすることはしていませんパターンのパラダイムを破壊する? – yarin

答えて

1

2つの可能性が頭に浮かぶ:

  1. 派生クラスごとに派生ビルダークラスを作成し、すべてのメソッドにオーバーロードを追加し、派生ビルダークラスを戻り値として返します。それ以外の場合は、スーパークラスのメソッドを呼び出します。これは継承されたメソッドの戻り型の共分散のためにJavaで機能します。しかし、これはあなたが嫌うような解決策でもあります。

    • か -
  2. Generifyビルダークラス:コンクリートビルダー製品のクラスを表す型パラメータを追加し、適切に返すために派生製品の各クラスに静的ビルダー工法を追加ビルダークラスのインスタンス化されたインスタンス。このようにして、戻り値の型のためだけにBuilderメソッドのオーバーロードを回避し、派生した製品クラスのプロパティを実際に初期化する必要がある場合にのみ、Builderクラスのサブクラスを追加できます。