设计模式学习心得<工厂方法 Factory Method>

概述


  • 意图
    业务代码中常常有构造对象的过程,它拥有大量的参数。并且有很多地方需要这对象。
    简化对象构造过程。

  • 主要解决
    一个类在不同场景的频繁地创建,让不同对象的创建更有语义化,提高代码复用性。

  • 何时使用
    当您想在不同的业务场景,创建略微不同的对象。

  • 如何解决
    通过契约式设计(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,可以协助自动将调用过程重构

  1. 右键选中代码段,打开菜单
  2. 选择Refactor,打开子菜单
  3. 选择Extract,打开子菜单
  4. 选择Method...
原文地址:https://www.cnblogs.com/snifferhu/p/9172987.html