概述
-
意图
业务代码中常常有构造对象的过程,它拥有大量的参数。并且有很多地方需要这对象。
简化对象构造过程。 -
主要解决
一个类在不同场景的频繁地创建,让不同对象的创建更有语义化,提高代码复用性。 -
何时使用
当您想在不同的业务场景,创建略微不同的对象。 -
如何解决
通过契约式设计(Design by Contract - DBC)设计原则,通过方法名作为契约。
用不同的方法名,构造不同的对象。 -
关键代码
相应场景定义相应方法名的构造方法。 -
使用场景
创建初始状态的普通用户和商户用户。
创建不同的子类对象。
注意事项
类如果不含有公有的或者受保护的构造函数,就不能被子类化。
它与其他的静态方法没有任何区别。
实现方式
public class Statement {
private Integer id;
private Long statementNo = Long.valueOf(Long.parseLong(DateHelper.formatYMDHMS(new Date()) + RandomHelper.getRandom()));
private Integer statementableId;
private String statementableType;
private String targetName;
private String targetType;
private Integer targetId;
private Boolean isPaid;
private String status;
private BigDecimal amount;
private String payMethod;
private String createdAt;
private String updatedAt;
private String subject;
private String orderNo;
private String remark;
private String payUrl;
private Long newOrderNo;
private Integer userMerchantId;
private Integer userStoreId;
private Integer targetMerchantId;
private Integer targetStoreId;
public Statement() {
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
.................
public static Statement getStatement(Order order, StoreExtension store, BigDecimal diffAmount) {
Statement memberStatement = new Statement();
memberStatement.setStatementableId(order.getMemberId());
memberStatement.setStatementableType(TargetHelper.getTargetType(0));
memberStatement.setSubject("余额消费");
memberStatement.setTargetName(TargetHelper.getTargetName(1));
memberStatement.setTargetType(TargetHelper.getTargetType(1));
memberStatement.setTargetId(store.getMerchantId());
memberStatement.setAmount(diffAmount);
memberStatement.setPayMethod("balance");
memberStatement.setStatus("已支付");
memberStatement.setOrderNo(order.getOrderNo());
memberStatement.setIsPaid(true);
memberStatement.setNewOrderNo(Long.valueOf(order.getOldOrderNo()));
return memberStatement;
}
}
提示:如果是使用idea,可以协助自动将调用过程重构
- 右键选中代码段,打开菜单
- 选择Refactor,打开子菜单
- 选择Extract,打开子菜单
- 选择Method...