概述


  • 意图

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

    简化对象构造过程。

  • 主要解决

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

  • 何时使用

    当您想在不同的业务场景,创建略微不同的对象。

  • 如何解决

    通过契约式设计(Design by Contract - DBC)设计原则,通过方法名作为契约。

    用不同的方法名,构造不同的对象。

  • 关键代码

    相应场景定义相应方法名的构造方法。

  • 使用场景

    创建初始状态的普通用户和商户用户。

    创建不同的子类对象。

注意事项

类如果不含有公有的或者受保护的构造函数,就不能被子类化。

它与其他的静态方法没有任何区别。

实现方式


  1. public class Statement {
  2. private Integer id;
  3. private Long statementNo = Long.valueOf(Long.parseLong(DateHelper.formatYMDHMS(new Date()) + RandomHelper.getRandom()));
  4. private Integer statementableId;
  5. private String statementableType;
  6. private String targetName;
  7. private String targetType;
  8. private Integer targetId;
  9. private Boolean isPaid;
  10. private String status;
  11. private BigDecimal amount;
  12. private String payMethod;
  13. private String createdAt;
  14. private String updatedAt;
  15. private String subject;
  16. private String orderNo;
  17. private String remark;
  18. private String payUrl;
  19. private Long newOrderNo;
  20. private Integer userMerchantId;
  21. private Integer userStoreId;
  22. private Integer targetMerchantId;
  23. private Integer targetStoreId;
  24. public Statement() {
  25. }
  26. public Integer getId() {
  27. return this.id;
  28. }
  29. public void setId(Integer id) {
  30. this.id = id;
  31. }
  32. .................
  33. public static Statement getStatement(Order order, StoreExtension store, BigDecimal diffAmount) {
  34. Statement memberStatement = new Statement();
  35. memberStatement.setStatementableId(order.getMemberId());
  36. memberStatement.setStatementableType(TargetHelper.getTargetType(0));
  37. memberStatement.setSubject("余额消费");
  38. memberStatement.setTargetName(TargetHelper.getTargetName(1));
  39. memberStatement.setTargetType(TargetHelper.getTargetType(1));
  40. memberStatement.setTargetId(store.getMerchantId());
  41. memberStatement.setAmount(diffAmount);
  42. memberStatement.setPayMethod("balance");
  43. memberStatement.setStatus("已支付");
  44. memberStatement.setOrderNo(order.getOrderNo());
  45. memberStatement.setIsPaid(true);
  46. memberStatement.setNewOrderNo(Long.valueOf(order.getOldOrderNo()));
  47. return memberStatement;
  48. }
  49. }

提示:如果是使用idea,可以协助自动将调用过程重构

  1. 右键选中代码段,打开菜单
  2. 选择Refactor,打开子菜单
  3. 选择Extract,打开子菜单
  4. 选择Method...

设计模式学习心得<工厂方法 Factory Method>的更多相关文章

  1. 设计模式学习心得<代理模式 Proxy>

    在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这种类型的设计模式属于结构型模式. 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口. 概述 意图 为其他对象提供 ...

  2. 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  3. 设计模式学习之代理模式(Proxy,结构型模式)(11)

    参考地址:http://www.cnblogs.com/zhili/p/ProxyPattern.html 一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访 ...

  4. 设计模式学习之代理模式(Proxy)

    一.代理模式的初衷 不想让客户端直接访问具体实现接口,客户端不应该直接访问具体实现,一般会涉及到以下四个对象 业务接口:定义客户端访问的接口,是实现类和代理类都需要实现的 实现类:实现了业务接口,真正 ...

  5. Java设计模式学习记录-代理模式

    代理模式 代理模式是常见设计模式的一种,代理模式的定义是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...

  6. 设计模式入门之代理模式Proxy

    //代理模式定义:为其它对象提供一种代理以控制对这个对象的訪问 //实例:鉴于书中给出的样例不太好.并且有些疑问,所以直接用保护代理作为实例 //要求,一旦订单被创建,仅仅有订单的创建人才干够改动订单 ...

  7. 学习笔记——代理模式Proxy

    代理模式,主要是逻辑和实现解耦.具体逻辑如何,由代理Proxy自己来设计,我们只需要把逻辑Subject交给代理即可. 主要应用场景,包括创建大开销对象时,使用代理来慢慢创建:远程代理,如网络不确定时 ...

  8. 《JAVA设计模式》之代理模式(Proxy)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述代理(Proxy)模式的: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式的结 ...

  9. javascript设计模式学习之六——代理模式

    一.代理模式定义 代理模式的关键是:当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问.代理模式需要和本体对外提供相同的接口,对用户来说是透明的.代理模式的种类有 ...

  10. 设计模式学习心得<组合模式 Composite>

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...

随机推荐

  1. c++11 tuple实现

    实现一个简易版的c++11 tuple. 我使用的编译器是gcc,codeblocks13.12自带的,哪个版本我不熟gcc也没去查. 大致看了下他家的tuple实现,多继承,tuple之上还有2个辅 ...

  2. RouterOS限速更高级运用

    转自这里 一般我们用ros限速只是使用了max-limit,其实ros限速可以更好的运用.比如我们希望客户打开网页时速度可以快一些,下载时速度可以慢一些.ros2.9就可以实现. 看图片 max-li ...

  3. 如何修改MSSQL的用户名

    Alter LOGIN sa DISABLE Alter LOGIN sa WITH NAME = [systemAccount] "systemAccount" 为SA的新名称, ...

  4. python import引入不同路径下的模块

    转载 python 包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径. 下面将具体介绍几种常用情况: (1)主程序与模块程序在同一目录下: 如下面程序结构: `- ...

  5. STM32_杂_01_串口代码

    #include "stm32f10x.h" #include "serial.h" #include "rtthread.h" #incl ...

  6. js中slice方法(转)

    1.String.slice(start,end)returns a string containing a slice, or substring, of string. It does not m ...

  7. Oracle 学习笔记(六)

    Oracle 数据库常用的闪回sql 语句及其它操作语句: --Oracle 数据库dml sql -- 查看当前用户所拥有的表 select * from tab; --表空间,auto: 自动管理 ...

  8. 为 github markdown 文件生成目录(toc)

    业务需要 在编写 github 项目时,有时候会编写各种 README.md 等 markdown 文件,但是 github 默认是没有目录的. 于是就自己写了一个小工具. markdown-toc ...

  9. svg转png

    svg转png网络上常用的方式有两种: 1.直接转base64放到图片src进行显示,测试效果不佳,始终报方法问题. 2.先转canvas,再转为png图,测试效果可以但svg透明背景到了canvas ...

  10. 注解_Annotation

    ---恢复内容开始--- 一.什么是注解 注解,英文Annotation,它不是程序本身,是对程序的解释,在这里我会想到为什么不能使用注释呢,因为注解是关于程序对信息的处理的流程的一些说明,而且格式也 ...