生成器模式又称为建造者模式,主要用于创建复杂的对象,这类对象通常有许多属性,需要根据业务设置或多或少的参数,如果把参数全部都放在构造方法或者初始化方法中就会显得很臃肿,通过生成器模式,我们可以把创建对象这个过程抽象出来分为多个步骤,可分为必须和非必需步骤,使用者可以根据自己的业务进行调用。
下面还是以搜索引擎为例,来看看生成器模式的套路,假设我们有一个搜索引擎类。
1public class SearchEngine {
2 private String name;
3 private String language;
4 private String fileType;
5
6 private SearchEngine(Builder builder) {
7 this.name = builder.name;
8 this.language = builder.language;
9 this.fileType = builder.fileType;
10 }
11 ...
12}
SearchEngine中name是必传参数,其它的是可选参数,根据这个特点实现Builder,我们通常会将Builder类放在其需要生成的类内部,申明为一个静态内部类,这样可以让生成器更好的控制权限。
1public static class Builder {
2 private String name;
3 private String language;
4 private String fileType;
5
6 public Builder(String name) {
7 this.name = name;
8 }
9
10 public Builder setLanguage(String language) {
11 this.language = language;
12 return this;
13 }
14
15 public Builder setFileType(String fileType) {
16 this.fileType = fileType;
17 return this;
18 }
19
20 public SearchEngine build() {
21 return new SearchEngine(this);
22 }
23}
24
25SearchEngine engine = new SearchEngine.Builder("Google")
26 .setLanguage("zh")
27 .setFileType("pdf")
28 .build();
生成器模式一般是在需要生成的类中定义一个名为Builder
的静态内部类,然后把需要设置的参数通过Builder暴露出来,在使用的时候可以通过链式调用来设置各种参数 ,最后通过build方法将创建好的对象返回。
通过生成器模式,可以将复杂的对象创建逻辑抽象出来,减少原来类的工作量,还能让创建对象的逻辑更加清晰、简洁。