欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式—建造者模式(Builder)

程序员文章站 2022-06-01 17:02:42
title: 设计模式—建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。我们获得一个对象的时候不是直接new这个对象出来,而是对其建造者进行属性设置,然后建造 ......

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

模式结构

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

  • builder:抽象建造者
  • concretebuilder:具体建造者
  • director:指挥者
  • product:产品角色

源码导读

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

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`中也有使用到建造者模式,其 `authenticationmanagerbuilder`是 `authenticationmanager`的建造者,我们可以通过配置 `authenticationmanagerbuilder`来建造一个 `authenticationmanager
public class securityconfig extends websecurityconfigureradapter {    @override    protected void configure(authenticationmanagerbuilder auth) throws exception {        auth.userdetailsservice(userdetailsservice).passwordencoder(passwordencoder);    }}

我们来看看 authenticationmanagerbuilder

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那么使用建造者模式就很方便,一个注解搞定。