设计模式.构建器模式(Jwt.builder().build())

Jwts.builder()
//写入账号状态
.claim(STATUS, jwtSetting.getStatus())
// 写入认证对象的权限集
.claim(PLATFORM, jwtSetting.getPlatform())
// 写入认证账号显示名称
.claim(SHOWNAME, jwtSetting.getShowName())
// 写入认证账户名
.setSubject(jwtSetting.getLoginName())
// 写入认证对象具体信息
.claim(ACCOUNT, jwtSetting.getAccountJsonString())
// 写入认证对象的权限集
.claim(AUTHORITIES, jwtSetting.getAuthorities())
// 有效期设置,
.setExpiration(expiration)
// 签名设置
.signWith(SignatureAlgorithm.HS512, jwtSetting.getSecret())
.compact();

这就是构建器


解决问题

类包含N个(N>4才有意义)参数,且业务含义使得 每次都是N中的几个参数组合一块,其余就不用设置了。

要求

  1. 需要能记录具体参数组合
  2. 保证线程同步,即:A,B,C 三个参数都设置后才意义,那么在设置ABC中间就不能有获取对象的操作
  3. 写法不是很浪费代码

引入示例

Toy有四个参数

public class Toy1 {

    private String head;

    private String body;

    private ArrayList<String> legs;

private ArrayList<String> hands;

}

方案

构造器的重载来实现

 缺点:不灵活,业务组合很多,都需要代码实现

Set/Get方法 实现

缺点:并发逻辑中,New一个对象后,有数行代码来赋值,这过程中可能有线程访问,即:对象也没准备好久开始访问了,如:面捞到碗里了,没放卤呢,就有人把饭拿走 。

同时增加了代码行数。

构造器1

 即:创建一个Builder,使用Build作为属性的封装来传值

实现:com.haiwei.create.builder

缺点:冗余Entity

是不是感觉如果这都能算是一种模式,那么设计模式就不应该是23种

public class Toy4 {
    private String head;
    private String body;
    
    public Toy4(Builder build) {
        this.head = build.getHead();
        this.body = build.getBody();
    }
    
    public static class Builder{
        private String head;
        private String body;
        // head和body getter和setter方法
    }
}

/**
 * 构造器1:只是多创建出来一个中间实体来传值
*/
Builder build4 = new Builder();
build4.setHead("head4");
Toy4 t4 = new Toy4(build4 );

构造器2

方案:

  • 同样借助一个Builder来创建,区别是:Builder不需要自己有属性,把Toy的数据存储一边,直接使用Toy不是更好。
  • Builder设置数据同样使用Setter方法
  • Builder会多一个build方法,在Setter完所有需要属性后build,返回Toy对象

实现:com.haiwei.create.builder

调用:
        /**
         * 构造器2: 
         */
        Toy3 toy = new Toy3.Builder()
            .setBody("body1")
            .setHead("head1")
            .build();
        toy.show();
实现:
public class Toy3 {
    private String head;
    private String body;
    
    public static class Builder{
        
        private Toy3 toy = new Toy3();
        
        public Builder setHead(String head) {
            toy.head = head;
            return this;
        }
        public Builder setBody(String body) {
            toy.body = body;
            return this;
        }
        
        public Toy3 build(){
            return this.toy;
        }
    }
    
    public void show(){
        System.out.println("Toy3 [head=" + head + ", body=" + body + "]");
    }
}

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值