Builder 的应用

改造前

当前正在开发工会宣战的一个系统,需要存储宣战记录。但是记录包括很多数据,开始使用构造方法传递参数。

DeclareWarUnionInfo(CrossAllianceService crossAllianceService, long unionId, long acceptUnionId, long warTime,
                        long declareHumanId, String declareHumanName) {
        this.crossAllianceService = crossAllianceService;

        crossDeclareWarInfoDB = new CrossDeclareWarInfoDB();
        crossDeclareWarInfoDB.setId(Port.applyId());
        crossDeclareWarInfoDB.setUnionId(unionId);
        crossDeclareWarInfoDB.setAcceptUnionId(acceptUnionId);
        crossDeclareWarInfoDB.setAccept(EDeclare.NOT_ACCEPT.getIndex());
        crossDeclareWarInfoDB.setWartime(warTime);
        crossDeclareWarInfoDB.setDeclareHumanId(declareHumanId);
        crossDeclareWarInfoDB.setDeclareHumanName(declareHumanName);
        crossDeclareWarInfoDB.setDatetime(Port.getTime());
        crossDeclareWarInfoDB.persist();
    }


    /**
     * 使用数据库对象初始化
     * @param crossAllianceService
     * @param crossDeclareWarInfoDB
     */
    DeclareWarUnionInfo(CrossAllianceService crossAllianceService, CrossDeclareWarInfoDB crossDeclareWarInfoDB) {
        this.crossAllianceService = crossAllianceService;
        this.crossDeclareWarInfoDB = crossDeclareWarInfoDB;
    }

构造方法参数一堆,创建的时候要传入一堆参数。

DeclareWarUnionInfo createDeclareWarUnionInfo = new DeclareWarUnionInfo(this, unionId, opponentUnionId,
                warTime, declareHumanId, declareHumanName);

// 方式2
DeclareWarUnionInfo declareWarUnionInfo = new DeclareWarUnionInfo(this, db);

变为Builder

写完之后,总是觉得这种方法不是很好。后来想到了EffectiveJava 中讲到的Builder,突然豁然开朗,这个时候其实运用这种方法可能获得很好的效果。于是开始改造。

public class DeclareWarUnionInfo {

    ...

    /**
     * DeclareWarUnionInfo 构造器
     */
    static class Builder {
        private final CrossAllianceService crossAllianceService;
        private long unionId;
        private long acceptUnionId;
        private EDeclare eDeclare = EDeclare.NOT_ACCEPT;
        private long warTime;
        private long declareHumanId;
        private String declareHumanName;
        private long dateTime;
        private CrossDeclareWarInfoDB crossDeclareWarInfoDB;

        Builder(CrossAllianceService crossAllianceService, long unionId, long acceptUnionId) {
            this.crossAllianceService = crossAllianceService;
            this.unionId = unionId;
            this.acceptUnionId = acceptUnionId;
        }

        Builder(CrossAllianceService crossAllianceService, CrossDeclareWarInfoDB crossDeclareWarInfoDB) {
            this.crossAllianceService = crossAllianceService;
            this.crossDeclareWarInfoDB = crossDeclareWarInfoDB;
        }

        Builder addWarTime(long val) {
            warTime = val;
            return this;
        }

        Builder addDeclareHumanId(long val) {
            this.declareHumanId = val;
            return this;
        }

        Builder addDeclareHumanName(String val) {
            this.declareHumanName = val;
            return this;
        }

        Builder addDateTime(long val) {
            this.dateTime = val;
            return this;
        }

        DeclareWarUnionInfo build() {
            return new DeclareWarUnionInfo(this);
        }
    }

    
    ...
}

构造方法,进行private,防止直接new对象。只能通过带有Builder参数的构造方法在内部类Builder中实例化。(crossDeclareWarInfoDB是一个数据库对象,当传入此对象时是在从数据库载入对象。另外一种方式就创建对象,并且保存数据库)

/**
     * 构造函数,此类仅能通过Builder创建
     * @param builder 构造器
     */
    private DeclareWarUnionInfo(Builder builder) {
        crossAllianceService = builder.crossAllianceService;

        if (builder.crossDeclareWarInfoDB == null) {
            crossDeclareWarInfoDB = new CrossDeclareWarInfoDB();
            crossDeclareWarInfoDB.setId(Port.applyId());
            crossDeclareWarInfoDB.setUnionId(builder.unionId);
            crossDeclareWarInfoDB.setAcceptUnionId(builder.acceptUnionId);
            crossDeclareWarInfoDB.setAccept(builder.eDeclare.getIndex());
            crossDeclareWarInfoDB.setWartime(builder.warTime);
            crossDeclareWarInfoDB.setDeclareHumanId(builder.declareHumanId);
            crossDeclareWarInfoDB.setDeclareHumanName(builder.declareHumanName);
            crossDeclareWarInfoDB.setDatetime(builder.dateTime);
            crossDeclareWarInfoDB.persist();
        } else {
            crossDeclareWarInfoDB = builder.crossDeclareWarInfoDB;
        }

    }

创建对象:

// 方式1:
DeclareWarUnionInfo declareWarUnionInfo = new DeclareWarUnionInfo.Builder(this, db).build();


// 方式2:
DeclareWarUnionInfo createDeclareWarUnionInfo = new DeclareWarUnionInfo.Builder(this, unionId, acceptUnionId)
                .addWarTime(warTime)
                .addDeclareHumanId(humanId)
                .addDeclareHumanName(humanName)
                .build();

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值