在 Java 的建造者样式与构成
意图:
将复杂对象的构造与其表示分开,以便相同的构造过程可以创建不同的表示
当你具有很少的必需属性和许多可选属性来构造对象时,构建器模式非常有用。要创建具有不同强制和可选属性的对象,必须提供复杂的构造函数来创建对象 .Builder 模式提供了构建复杂对象的简单逐步过程。
真实用例:
FaceBook 中的不同用户具有不同的属性,包括用户名等强制属性以及 UserBasicInfo 和 ContactInfo 等可选属性。有些用户只是提供基本信息。一些用户提供详细信息,包括联系信息。如果没有 Builder 模式,则必须为构造函数提供所有必需参数和可选参数。但 Builder 模式通过提供简单的逐步过程来构建复杂对象,从而简化了构建过程。
提示:
- 提供静态嵌套构建器类。
- 为对象的强制属性提供构造函数。
- 为对象的可选属性提供 setter 和 getter 方法。
- 设置可选属性后返回相同的 Builder 对象。
- 提供
build()
方法,返回复杂对象
代码段:
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
说明:
-
FaceBookUser
是一个复杂的对象,具有使用组合的以下属性:String userName; UserBasicInfo userInfo; ContactInfo contactInfo;
-
FaceBookUserBuilder
是一个静态构建器类,它包含并构建FaceBookUser
。 -
userName
只是建立FaceBookUser
的必备参数 -
FaceBookUserBuilder
通过设置可选参数来构建FaceBookUser
:UserBasicInfo
和ContactInfo
-
此示例说明了使用 Builder 构建的具有不同属性的三个不同 FaceBookUser。
- fbUser1 仅作为 FaceBookUser 构建,仅具有 userName 属性
- fbUser2 使用 userName 和 UserBasicInfo 构建为 FaceBookUser
- fbUser3 使用 userName,UserBasicInfo 和 ContactInfo 构建为 FaceBookUser
在上面的示例中,使用了合成而不是在 Builder 类中复制 FaceBookUser 的所有属性。
在创作模式中,我们将首先从像 FactoryMethod
这样的简单模式开始,然后转向更加灵活和复杂的模式,如 AbstractFactory
和 Builder
。