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...
  • 相关阅读:
    js实现倒数 —— ‘剩下多少天多少秒’
    CSS单位,em,rem以及元素的宽度和高度
    基于原生JS+node.js+mysql打造的简易前后端分离用户登录系统
    隐藏微信小程序剪贴板提示
    微信小程序实现多选分享
    微信小程序开发过程中出现问题及解答
    Visual Studio Code 使用指南
    openLayers 4 canvas图例绘制,canvas循环添加图片,解决图片闪烁问题
    微信小程序个人/企业开放服务类目一览表
    微信小程序日常开发中常遇到的错误代码
  • 原文地址:https://www.cnblogs.com/snifferhu/p/9172987.html
Copyright © 2011-2022 走看看