使用组成。为了使事情变得更加轻松和整洁,请不要在source(
Foo)和builder(
Builder)类中复制所有属性。
例如,在
Foo类内部
Builder而不是每个
Foo属性。
简单的代码段:
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|nullFacebook user 2:|User|Ravindra|UserInfo|Name:DOB:Gender:sunrise:25-May-1975:M|ContactInfo|nullFacebook user 3:|User|Ravindra|UserInfo|Name:DOB:Gender:sunrise:25-May-1975:M|ContactInfo|email:mobile(H):mobile(W):xxx@xyz.com:1111111111:2222222222
说明:
FaceBookUser
是一个复杂对象,具有以下使用合成的属性:String userName;
UserBasicInfo userInfo;
ContactInfo contactInfo;FaceBookUserBuilder
是静态构建器类,其中包含和buildsFaceBookUser
。userName是构建FaceBookUser的唯一必需参数
FaceBookUserBuilder
建立FaceBookUser
通过设置可选参数:UserBasicInfo
和ContactInfo
本示例说明了
FaceBookUsers
从Builder构建的具有不同属性的三个不同属性。- fbUser1被构建为仅具有userName属性的FaceBookUser
- fbUser2被构建为FaceBookUser,具有userName和UserBasicInfo
- fbUser3被构建为FaceBookUser,具有userName,UserBasicInfo和ContactInfo
在此示例中,已使用合成,而不是在Builder类中复制FaceBookUser的所有属性。
编辑:
将所有相关属性分组为逻辑类。在FaceBookUser中定义所有这些类。不必在类中的
Builder包含
FaceBookUser中再次添加所有这些成员变量
Builder。
为简单起见,我添加了两个类:UserBasicInfo和ContactInfo。现在,使用其他属性将这个FaceBookUser类爆炸
NewsFeedMessagesFriendsAlbumsEventsGamesPagesAds
等等
如果您在
Builder和中都复制了所有这些属性
FaceBookUser,则代码将变得难以管理。相反,使用的成分
FaceBookUser在
FaceBookUserBuilder本身,你可以简单的构建过程。
添加以上属性后,您将
FaceBookUser像往常一样逐步进行构建。
它将是这样的:
FaceBookUser fbUser3 = new FaceBookUser.FaceBookUserBuilder("Ravindra"). setUserBasicInfo(info). setNewsFeed(newsFeed). setMessages(messages). setFriends(friends). setAlbums(albums). setEvents(events). setGames(games). setAds(ads).build();


