Build模式将构造与表示进行分离,不同的构造过程有不同的表示。
使用场景
① 当一个类,调用其不同方法/或者调用顺序不同时,需要产生不同的表示结果时。 ② 当初始化一个类,需要设置比较多成员参数时。 ③ 配置类
代码实现
实现的几个角色:
1.AbstractUser抽象类
2.User具体类
3.AbstractUserBuild抽象Build类
4.UserBuild具体的Build类
5.UserDirector构建过程类
6.IUser接口类(用于抽象动作,可有可无)
参考AlertDialog的Build构建模式,可对以上几个角色进行简化:
User具体类/UserParams成员参数类/UserBuild静态内部类/IUser
简单实现:
① User具体类/Build静态内部类
public class User implements IUser{
UserParams params;
protected User(){
}
public void setSkinColor(String skinColor) {
this.params.skinColor = skinColor;
}
public void setAddress(String address) {
this.params.address = address;
}
public void setLanguage(String language) {
this.params.language = language;
}
@Override
public void show() {
System.out.print("我是"+params.address+"人 "+"我的皮肤是"+params.skinColor
+ " 我的母语是"+params.language);
}
public static class Build {
UserParams params;
public Build() {
this.params = new UserParams();
}
public Build setSkinColor(String skinColor) {
this.params.skinColor = skinColor;
return this;
}
public Build setAddress(String address){
this.params.address = address;
return this;
}
public Build setLanguage(String language) {
this.params.language = language;
return this;
}
public User init(){
final User user = new User();
user.params = params;
return user;
}
}
}
② UserParams成员参数类
public class UserParams {
String skinColor;
String address;
String language;
}
③ IUser动作抽象接口
public interface IUser {
void show();
}
调用链实现
public class BuildModeTest {
public static void main(String[] args){
new User.Build().setAddress("美国")
.setLanguage("英文")
.setSkinColor("白色")
.init().show();
System.out.print("\n");
new User.Build().setAddress("中国")
.setLanguage("中文")
.setSkinColor("黄色")
.init().show();
}
}
优缺点
① Build模式将构建和表示分离开来,通过调用链方式,使代码简洁易懂。
② 封装性,使用者不需知道该类的具体细节。
③ 建造者独立,容易扩展。
【缺点】产生对于Build对象,销毁内存。