概念
建造者模式,又称为生成器模式,是一种对象构建模式,将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造不同的属性对象出来;
优点
1,相对静态工厂和构造器,可以很好的扩展到大量的可选参数; 比如构造一个包装食品的营养成分标签;
2,相对javaBean来说,可以更好实现类的可变性;
3,增加新的具体建造者无需修改类库代码,符合开闭原则;
4,相对抽象工厂模式,建造者需要建造蓝图,按照蓝图组装零配件生产产品; 抽象工厂,不关心工厂内部实现细节,只关心最终生产产品;
缺点
1,建造者不适用产品之间差异性很大的情况,使用建造者模式需要产品具有较多的共同点;
2,不适用产品内部变化很复杂的情况,产品内部变化复杂,会导致需要定义很多具体建造者类来实现这种变化,导致系统变得异常庞大;
实例
建造者模式在elasticsearch的链接创建和查询语句创建中得到了大量的使用;
//构建setting
Settings settings = Settings.settingsBuilder().put("cluster.name","wenbronk_escluster").build();
//构建transportClient
client = TransportClient.builder()
.settings(settings).build()
.addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress("192.168.50.37", 9300)));
//组合查询
QueryBuilder queryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("user", "kimchy"))
.mustNot(QueryBuilders.termQuery("message", "nihao"))
.should(QueryBuilders.termQuery("gender", "male"));
searchFunction(queryBuilder);
bulkProcessor = BulkProcessor.builder(client, new BulkProcessor.Listener() { /* Listener methods */ }).setBulkActions(10000)
.setConcurrentRequests(0)
.build();
建造者模式使用案例
public class Search extends AbstractAction<SearchResult> {
private String query;
private List<Sort> sortList = new LinkedList();
protected List<String> includePatternList = new ArrayList();
protected List<String> excludePatternList = new ArrayList();
protected Search(Search.Builder builder) {
super(builder);
this.query = builder.query;
this.sortList = builder.sortList;
this.includePatternList = builder.includePatternList;
this.excludePatternList = builder.excludePatternList;
this.setURI(this.buildURI());
}
public static class Builder extends AbstractMultiTypeActionBuilder<Search, Search.Builder> {
protected String query;
protected List<Sort> sortList = new LinkedList();
protected List<String> includePatternList = new ArrayList();
protected List<String> excludePatternList = new ArrayList();
public Builder(String query) {
this.query = query;
}
public Search.Builder setSearchType(SearchType searchType) {
return (Search.Builder)this.setParameter("search_type", searchType);
}
public Search.Builder enableTrackScores() {
this.setParameter("track_scores", true);
return this;
}
public Search.Builder addSort(Sort sort) {
this.sortList.add(sort);
return this;
}
public Search.Builder addSourceExcludePattern(String excludePattern) {
this.excludePatternList.add(excludePattern);
return this;
}
public Search.Builder addSourceIncludePattern(String includePattern) {
this.includePatternList.add(includePattern);
return this;
}
public Search.Builder addSort(Collection<Sort> sorts) {
this.sortList.addAll(sorts);
return this;
}
public Search build() {
return new Search(this);
}
}
}
//使用方式:
Search.Builder builder = new Search.Builder(query);
builder.addIndex(xxx).addType(xxx).build();
使用技巧
1,可以一个buidler构建多个对象;
2,可随时根据需要改变构建的对象;
3,可以自动填充某些域,
4,可以多次调用某一个方法将参数集中在一个域中;