且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

将构建器保持在单独的类中(流畅的界面)

更新时间:2023-01-25 09:27:07

使用构图。为了使事情更简单,更清晰,请不要复制源( Foo )和构建器( Builder )类中的所有属性。

Use composition. To make things easier and cleaner, do not replicate all attributes in source (Foo) and builder (Builder) class.

例如,在 Builder 中改为 Foo 类每个 Foo 属性。

For example, have Foo class inside Builder instead of each of Foo attribute.

简单代码片段:

import java.util.*;

class UserBasicInfo{
    String nickName;
    String birthDate;
    String gender;

    public UserBasicInfo(String name,String date,String gender){
        this.nickName = name;
        this.birthDate = date;
        this.gender = gender;        
    }

    public String toString(){
        StringBuilder sb = new StringBuilder();
        sb.append("Name:DOB:Gender:").append(nickName).append(":").append(birthDate).append(":").
        append(gender);
        return sb.toString();
    }
}

class ContactInfo{
    String eMail;
    String mobileHome;
    String mobileWork;

    public ContactInfo(String mail, String homeNo, String mobileOff){
        this.eMail = mail;
        this.mobileHome = homeNo;
        this.mobileWork = mobileOff;
    }    
    public String toString(){
        StringBuilder sb = new StringBuilder();
        sb.append("email:mobile(H):mobile(W):").append(eMail).append(":").append(mobileHome).append(":").append(mobileWork);
        return sb.toString();
    }
}
class FaceBookUser {
    String userName;
    UserBasicInfo userInfo;
    ContactInfo contactInfo;

    public FaceBookUser(String uName){
        this.userName = uName;
    }    
    public void setUserBasicInfo(UserBasicInfo info){
        this.userInfo = info;
    }
    public void setContactInfo(ContactInfo info){
        this.contactInfo = info;
    }    
    public String getUserName(){
        return userName;
    }
    public UserBasicInfo getUserBasicInfo(){
        return userInfo;
    }
    public ContactInfo getContactInfo(){
        return contactInfo;
    }

    public String toString(){
        StringBuilder sb = new StringBuilder();
        sb.append("|User|").append(userName).append("|UserInfo|").append(userInfo).append("|ContactInfo|").append(contactInfo);
        return sb.toString();
    }

    static class FaceBookUserBuilder{
        FaceBookUser user;
        public FaceBookUserBuilder(String userName){
            this.user = new FaceBookUser(userName);
        }
        public FaceBookUserBuilder setUserBasicInfo(UserBasicInfo info){
            user.setUserBasicInfo(info);
            return this;
        }
        public FaceBookUserBuilder setContactInfo(ContactInfo info){
            user.setContactInfo(info);
            return this;
        }
        public FaceBookUser build(){
            return user;
        }
    }
}
public class BuilderPattern{
    public static void main(String args[]){
        FaceBookUser fbUser1 = new FaceBookUser.FaceBookUserBuilder("Ravindra").build(); // Mandatory parameters
        UserBasicInfo info = new UserBasicInfo("sunrise","25-May-1975","M");

        // Build User name + Optional Basic Info 
        FaceBookUser fbUser2 = new FaceBookUser.FaceBookUserBuilder("Ravindra").
                                                setUserBasicInfo(info).build();

        // Build User name + Optional Basic Info + Optional Contact Info
        ContactInfo cInfo = new ContactInfo("xxx@xyz.com","1111111111","2222222222");
        FaceBookUser fbUser3 = new FaceBookUser.FaceBookUserBuilder("Ravindra").
                                                setUserBasicInfo(info).
                                                setContactInfo(cInfo).build();

        System.out.println("Facebook user 1:"+fbUser1);
        System.out.println("Facebook user 2:"+fbUser2);
        System.out.println("Facebook user 3:"+fbUser3);
    }
}

输出:

Facebook user 1:|User|Ravindra|UserInfo|null|ContactInfo|null
Facebook user 2:|User|Ravindra|UserInfo|Name:DOB:Gender:sunrise:25-May-1975:M|ContactInfo|null
Facebook user 3:|User|Ravindra|UserInfo|Name:DOB:Gender:sunrise:25-May-1975:M|ContactInfo|email:mobile(H):mobile(W):xxx@xyz.com:1111111111:2222222222

说明:


  1. FaceBookUser 是一个复杂的对象,其中包含以下属性:

  1. FaceBookUser is a complex object with below attributes using composition:

String userName;
UserBasicInfo userInfo;
ContactInfo contactInfo;


  • FaceBookUserBuilder 是一个静态构建器class,包含并构建 FaceBookUser

  • FaceBookUserBuilder is a static builder class, which contains and builds FaceBookUser.

    userName只是构建FaceBookUser的必需参数

    userName is only Mandatory parameter to build FaceBookUser

    FaceBookUserBuilder 通过设置可选参数来构建 FaceBookUser : code> UserBasicInfo 和 ContactInfo

    FaceBookUserBuilder builds FaceBookUser by setting optional parameters : UserBasicInfo and ContactInfo

    此示例说明三不同的 FaceBookUsers 具有不同的属性,由Builder构建。

    This example illustrates three different FaceBookUsers with different attributes, built from Builder.


    1. fbUser1构建为FaceBookUser仅限userName属性

    2. fbUser2构建为具有userName和UserBasicInfo的FaceBookUser

    3. fbUser3构建为具有userName,UserBasicInfo和ContactInfo的FaceBookUser


  • 在此示例中,使用了合成而不是在Builder类中复制FaceBookUser的所有属性。

    In this example, composition has been used instead of duplicating all attributes of FaceBookUser in Builder class.

    编辑:

    将所有相关属性分组为逻辑类。在FaceBookUser中定义所有这些类。而不是在 Builder 中再次添加所有这些成员变量,而是在 Builder $中包含 FaceBookUser c $ c>上课。

    Group all related attributes into logical classes. Define all these classes in FaceBookUser. Instead of adding all these member variables again in Builder, contain FaceBookUser in Builder class.

    为简单起见,我添加了两个类:UserBasicInfo和ContactInfo。现在将这个FaceBookUser类与其他属性一起爆炸,例如

    For simplicity, I have added two classes: UserBasicInfo and ContactInfo . Now explode this FaceBookUser class with other attributes like

    NewsFeed
    Messages
    Friends
    Albums
    Events
    Games
    Pages
    Ads
    

    等。

    如果您在 Builder FaceBookUser $ c $中复制所有这些属性c>,代码将变得难以管理。相反,通过在 FaceBookUserBuilder 中使用 FaceBookUser 的组合,您可以简单地构建流程。

    If you duplicate all these attributes in both Builder and FaceBookUser, code will become difficult to manage. Instead, by using composition of FaceBookUser in FaceBookUserBuilder itself, you can simply construction process.

    添加上述属性后,您将像往常一样逐步构建 FaceBookUser

    Once you add above attributes, you will build FaceBookUser in step-by-step process as usual.

    它将是这样的:

    FaceBookUser fbUser3 = new FaceBookUser.FaceBookUserBuilder("Ravindra").
                                            setUserBasicInfo(info).
                                            setNewsFeed(newsFeed).
                                            setMessages(messages).
                                            setFriends(friends).
                                            setAlbums(albums).
                                            setEvents(events).
                                            setGames(games).
                                            setAds(ads).build();