前言
生成器模式的主要功能是构建复杂的产品,而且是细化的,分步骤的构建产品,也就是生成器模式重在解决一步一步构造复杂对象的问题。如果光是这么认识生成器模式的功能是不够的。
更为重要的是,这个构建的过程是统一的,固定不变的,变化的部分放到生成器部分了,只要配置不同的生成器,那么同样的构建过程,就能构建出不同的产品表示来。
再直白点说,生成器模式的重心在于分离构建算法和具体的构造实现,从而使得构建算法可以重用,具体的构造实现可以很方便的扩展和切换,从而可以灵活的组合来构造出不同的产品对象。
构建生成器模式
一个部分是Builder接口这边,这边是定义了如何构建各个部件,也就是知道每个部件功能如何实现,以及如何装配这些部件到产品中去。
另外一个部分是Director这边,Director是知道如何组合来构建产品,也就是说Director负责整体的构建算法,而且通常是分步骤的来执行。
public class Person {
private String color;
private String height;
private String weight;
private String gender;
private Person() {
}
@Override
public String toString() {
return "Person{" +
"gender='" + gender + '\'' +
", weight='" + weight + '\'' +
", height='" + height + '\'' +
", color='" + color + '\'' +
'}';
}
public static class Builder {
private String color;
private String height;
private String weight;
private String gender;
public Builder buildColor(String color) {
this.color = color;
return this;
}
public Builder buildWeight(String weight) {
this.weight = weight;
return this;
}
public Builder buildHeight(String height) {
this.height = height;
return this;
}
public Builder buildGender(String gender) {
this.gender = gender;
return this;
}
public Person build() {
Person person = new Person();
person.color = color;
person.gender = gender;
person.height = height;
person.weight = weight;
return person;
}
}
}
模式应用
// Android AlertDialog
public static class Builder {
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 setCustomTitle(View customTitleView) {
P.mCustomTitleView = customTitleView;
return this;
}
// 省略其他build方法
public AlertDialog create() {
// Context has already been wrapped with the appropriate theme.
final AlertDialog dialog = new AlertDialog(P.mContext, 0, false);
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;
}
}
AlertController.AlertParams
是AlertController
所需要的参数。
AlertController.AlertParams
通过调用apply()
方法,完成控制器到视图的调用。
而apply()
的方法的间接调用方是Builder
对象中的create()
方法。同时create()
、show()
方法也充当着Dirtector角色
。
总结
本例中生成器模式将生成对话框的诸多不确定性职责拆解,向外暴露这些职责并允许可以按照自己的需求填入职责。
生成器模式提供统一的生成过程:
new Builder().build(xxx).create().show();
因而不同的部件传入就会引起不同的视图表现。
设计模式的表达形式有很多种,但是思想都是一致的。
网友评论