建造者Builder模式介绍与实操

概念

建造者模式,又称为生成器模式,是一种对象构建模式,将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造不同的属性对象出来;

 

优点

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,可以多次调用某一个方法将参数集中在一个域中;

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值