zoukankan      html  css  js  c++  java
  • 设计模式学习心得<工厂方法 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...
  • 相关阅读:
    VirtualBox+Windbg 进行双机调试的方法
    (串口通信编程) 开源串口调试助手Common (Com Monitor)
    Win32SDK中(串行)通信资源概要(不断更新)
    对WDK中LIST_ENTRY的遍历
    用C语言写的一个控制台界面的通讯录管理系统
    我对Windows桌面任务栏自动隐藏功能的一点小小改进不再自动弹出(20130226更新)
    对WDK中对LIST_ENTRY的操作的相关函数的实现及简单运用
    我对CONTAINING_RECORD宏的详细解释
    基于51单片机实现模拟IIC总线时序
    uploadfy 常见问题收集
  • 原文地址:https://www.cnblogs.com/snifferhu/p/9172987.html
Copyright © 2011-2022 走看看