Builder模式定义
- 将一个复制对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。(抽象拗口)
Builder模式的使用场景
相同的方法,不同的执行顺序,产生不同的事件结果
当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值
多个布局或零件,都可以装配到一个对象中,但是产生的运行结构又不相同
简化的Builder模式
用一个内部类实现类的创建,链式调用,根据你的需要创建出来对象。
public class User {
private String name;
private String id;
private User() {}
private User(String name) {
this.name = name;
}
private User(String name, String id) {
this.name = name;
this.id = id;
}
private String getName() {
return name;
}
private void setName(String name) {
this.name = name;
}
private String getId() {
return id;
}
private void setId(String id) {
this.id = id;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return String.format("[name: %s, id: %s]",name,id);
}
//内部类
public static class Builder {
private User user = new User();
public Builder() {
}
public Builder setName(String name) {
user.setName(name);
return this;
}
public Builder setId(String id) {
user.setId(id);
return this;
}
public User build() {
return user;
}
}
}
//测试
public static void main(String[] args) {
User.Builder builder = new User.Builder();
User user = null;
user = builder.setName("lise")
.setId("11").build();//链式调用
System.out.println(user.toString());
}
经典Builder模式
UML类图
Product:产品抽象类
Builder:抽象Builder类,规范产品组建,一般是由子类实现
ConcreteBuilder:具体的Builder类
Director:统一组装过程
Product
public abstract class User {
protected String name;
protected String id;
protected int age;
protected String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void setId();
public void setAge(int age) {
this.age = age;
}
public void setAddress(String address) {
this.address = address;
}
@SuppressLint("DefaultLocale")
@Override
public String toString() {
return String.format(" User [name : %s, id : %s, age : %d, address : %s]", name,id,age,address);
}
}
具体的Product类
public class SysUser extends User {
public SysUser(){}
public void setId() {
id = "10086";
}
}
抽象的Builder类
public abstract class Builder {
public abstract void buildName(String name);
public abstract void buildId();
public abstract void buildAge(int age);
public abstract void buildAddress(String address);
public abstract User create();
}
具体的Builder类
public class AccountBuilder extends Builder {
private User user = new SysUser();
@Override
public void buildName(String name) {
user.setName(name);
}
@Override
public void buildId() {
user.setId();
}
@Override
public void buildAge(int age) {
user.setAge(age);
}
@Override
public void buildAddress(String address) {
user.setAddress(address);
}
@Override
public User create() {
return user;
}
}
Director角色,负责构造User
public class Director {
Builder mBuilder = null;
public Director(Builder builder){
this.mBuilder = builder;
}
public void construct(String name,int age,String address){
mBuilder.buildName(name);
mBuilder.buildId();
mBuilder.buildAge(age);
mBuilder.buildAddress(address);
}
}
测试代码
public static void main(String[] args) {
Builder builder = new AccountBuilder();
Director director = new Director(builder);
director.construct("tom", 23, "shenzhen");
System.out.println("Info :" + builder.create().toString());
}
结果输出
Info : User [ name : tom, id : 10086, age : 23, address : shenzhen]
优点:是创建与表示相互隔离,解耦
缺点:创建的类多,复杂的类关系。
Android中使用Builder模式
开发中用到的AlertDialog,示例如下:
private void showDialog(){
AlertDialog.Builder builder=new AlertDialog.Builder(context);
builder.setIcon(R.drawable.icon);
builder.setTitle("Title");
builder.setMessage("Message");
builder.setPositiveButton("Button1", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//TODO
}
});
builder.setNegativeButton("Button2", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//TODO
}
});
builder.create().show();
}