前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式日记-Builder

设计模式日记-Builder

作者头像
六个核弹
发布2022-12-23 20:55:47
2620
发布2022-12-23 20:55:47
举报
文章被收录于专栏:六个核弹的专栏

muggle 源码日记之建造者模式(Builder)

建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。我们获得一个对象的时候不是直接new这个对象出来,而是对其建造者进行属性设置,然后建造者在根据设置建造出各个对象出来。建造者模式又可以称为生成器模式。

模式结构

一个标准的建造者模式包含如下角色:

  • Builder:抽象建造者
  • ConcreteBuilder:具体建造者
  • Director:指挥者
  • Product:产品角色

源码导读

建造者模式使用比较简单,场景也比较清晰。protobuf中protobuf对应的java类就是使用建造者模式来创建对象的。

代码语言:javascript
复制
public static PersonEntity.Person create() {
    PersonEntity.Person person = PersonEntity.Person.newBuilder()
            .setId(1)
            .setName("Pushy")
            .setEmail("1437876073@qq.com")
            .build();

    System.out.println(person);
    return person;
}

一般建造者模式结合链式编程来使用,代码上更加美观。

spring security中也有使用到建造者模式,其 AuthenticationManagerBuilderAuthenticationManager的建造者,我们可以通过配置 AuthenticationManagerBuilder来建造一个 AuthenticationManager

代码语言:javascript
复制
public class SecurityConfig extends WebSecurityConfigurerAdapter {



    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
    }
}

我们来看看 AuthenticationManagerBuilder

代码语言:javascript
复制
public class AuthenticationManagerBuilder extends AbstractConfiguredSecurityBuilder<AuthenticationManager, AuthenticationManagerBuilder> implements ProviderManagerBuilder<AuthenticationManagerBuilder> {
    ......
    ......
     public final AuthenticationManager build() throws Exception {
        if (this.building.compareAndSet(false, true)) {
            this.object = this.doBuild();
            return this.object;
        } else {
            throw new AlreadyBuiltException("This object has already been built");
        }
    }
}

这里抽象建造者是 ProviderManagerBuilder,具体建造者是 AuthenticationManagerBuilder,被建造的对象是 AuthenticationManager 建造方法是 build()方法。

一般建造者模式中建造者类命名以 builder结尾,而建造方法命名为 build()

lombok中@builder就是对实体类使用创造者模式,如果你项目中用到了lombok那么使用建造者模式就很方便,一个注解搞定。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 六个核弹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • muggle 源码日记之建造者模式(Builder)
    • 模式结构
      • 源码导读
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档