將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。bash
public class Computer {
private String cpu;
private String mainBoard;
private String ram;
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getMainBoard() {
return mainBoard;
}
public void setMainBoard(String mainBoard) {
this.mainBoard = mainBoard;
}
public String getRam() {
return ram;
}
public void setRam(String ram) {
this.ram = ram;
}
}
複製代碼
public abstract class Builder {
public abstract void buildCpu(String cpu);
public abstract void buildMainBoard(String mainBoard);
public abstract void buildRam(String ram);
public abstract Computer build();
}
複製代碼
public class ComputerBuilder extends Builder {
private Computer mComputer = new Computer();
@Override
public void buildCpu(String cpu) {
mComputer.setCpu(cpu);
}
@Override
public void buildMainBoard(String mainBoard) {
mComputer.setMainBoard(mainBoard);
}
@Override
public void buildRam(String ram) {
mComputer.setRam(ram);
}
@Override
public Computer build() {
return mComputer;
}
}
複製代碼
起到封裝的做用,避免深刻到Builder內部的具體實現。能夠傳入不一樣的Builder實現對象。app
public class ComputerDirector {
private Builder mBuilder;
private ComputerDirector(Builder builder) {
this.mBuilder = builder;
}
public Computer createComputer(String cpu, String mainBoard, String ram) {
mBuilder.buildCpu(cpu);
mBuilder.buildMainBoard(mainBoard);
mBuilder.buildRam(ram);
return mBuilder.build();
}
}
複製代碼
public class ComputerTest {
public static void main(String[] args){
Builder builder = new ComputerBuilder();
ComputerDirector director = new ComputerDirector(builder);
director.createComputer("i3","my board", "4g");
}
}
複製代碼
在實際使用過程當中,有時會將Director進行省略,由調用者選擇部分參數進行設置ide
public static class Builder {ui
private final AlertController.AlertParams P;
public Builder(Context context) {
this(context, resolveDialogTheme(context, 0));
}
public Builder(Context context, int themeResId) {
P = new AlertController.AlertParams(new ContextThemeWrapper(
context, resolveDialogTheme(context, themeResId)));
}
public Builder setTitle(@StringRes int titleId) {
P.mTitle = P.mContext.getText(titleId);
return this;
}
public Builder setCustomTitle(View customTitleView) {
P.mCustomTitleView = customTitleView;
return this;
}
public Builder setMessage(@StringRes int messageId) {
P.mMessage = P.mContext.getText(messageId);
return this;
}
......
public AlertDialog create() {
// Context has already been wrapped with the appropriate theme.
final AlertDialog dialog = new AlertDialog(P.mContext, 0, false);
//調用了AlertParams的apply方法
P.apply(dialog.mAlert);
dialog.setCancelable(P.mCancelable);
if (P.mCancelable) {
dialog.setCanceledOnTouchOutside(true);
}
dialog.setOnCancelListener(P.mOnCancelListener);
dialog.setOnDismissListener(P.mOnDismissListener);
if (P.mOnKeyListener != null) {
dialog.setOnKeyListener(P.mOnKeyListener);
}
return dialog;
}
public AlertDialog show() {
final AlertDialog dialog = create();
dialog.show();
return dialog;
}
}
複製代碼
Builder中定義了一些set方法用來設置Dialog的參數,Builder方法內部是給AlertController.AlertParams進行參數賦值this
public static class AlertParams {
public final Context mContext;
public final LayoutInflater mInflater;
public int mIconId = 0;
public Drawable mIcon;
public int mIconAttrId = 0;
public CharSequence mTitle;
public View mCustomTitleView;
public CharSequence mMessage;
public CharSequence mPositiveButtonText;
......
public AlertParams(Context context) {
mContext = context;
mCancelable = true;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
//將參數賦值給了Dialog
public void apply(AlertController dialog) {
if (mCustomTitleView != null) {
dialog.setCustomTitle(mCustomTitleView);
} else {
if (mTitle != null) {
dialog.setTitle(mTitle);
}
if (mIcon != null) {
dialog.setIcon(mIcon);
}
if (mIconId != 0) {
dialog.setIcon(mIconId);
}
if (mIconAttrId != 0) {
dialog.setIcon(dialog.getIconAttributeResId(mIconAttrId));
}
}
if (mMessage != null) {
dialog.setMessage(mMessage);
}
......
}
}
複製代碼
AlertDialog.Builder builder = new AlertDialog.Builder(this);
// 設置參數
builder.setTitle("")
.setIcon(R.drawable.ic_launcher)
.setMessage("");
builder.create().show();
複製代碼
Builder模式一般做爲配置類的構造器將配置的構造和表示分離,而且經過調用鏈實現,使代碼調用更簡潔。spa