设计模式学习心得<工厂方法 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,可以协助自动将调用过程重构
- 右键选中代码段,打开菜单
- 选择Refactor,打开子菜单
- 选择Extract,打开子菜单
- 选择Method...
设计模式学习心得<工厂方法 Factory Method>的更多相关文章
- 设计模式学习心得<代理模式 Proxy>
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这种类型的设计模式属于结构型模式. 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口. 概述 意图 为其他对象提供 ...
- 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 设计模式学习之代理模式(Proxy,结构型模式)(11)
参考地址:http://www.cnblogs.com/zhili/p/ProxyPattern.html 一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访 ...
- 设计模式学习之代理模式(Proxy)
一.代理模式的初衷 不想让客户端直接访问具体实现接口,客户端不应该直接访问具体实现,一般会涉及到以下四个对象 业务接口:定义客户端访问的接口,是实现类和代理类都需要实现的 实现类:实现了业务接口,真正 ...
- Java设计模式学习记录-代理模式
代理模式 代理模式是常见设计模式的一种,代理模式的定义是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...
- 设计模式入门之代理模式Proxy
//代理模式定义:为其它对象提供一种代理以控制对这个对象的訪问 //实例:鉴于书中给出的样例不太好.并且有些疑问,所以直接用保护代理作为实例 //要求,一旦订单被创建,仅仅有订单的创建人才干够改动订单 ...
- 学习笔记——代理模式Proxy
代理模式,主要是逻辑和实现解耦.具体逻辑如何,由代理Proxy自己来设计,我们只需要把逻辑Subject交给代理即可. 主要应用场景,包括创建大开销对象时,使用代理来慢慢创建:远程代理,如网络不确定时 ...
- 《JAVA设计模式》之代理模式(Proxy)
在阎宏博士的<JAVA与模式>一书中开头是这样描述代理(Proxy)模式的: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式的结 ...
- javascript设计模式学习之六——代理模式
一.代理模式定义 代理模式的关键是:当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问.代理模式需要和本体对外提供相同的接口,对用户来说是透明的.代理模式的种类有 ...
- 设计模式学习心得<组合模式 Composite>
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...
随机推荐
- Linux之ls
命令功能: ls是list的简写,列出目录下的内容 命令格式: ls [OPTION]... [FILE]... 命令参数: -a,--all 不忽略以“.”开头的隐藏文件 -A, --almo ...
- 血红蛋白值的临床意义(hemoglobin ,Hb,HGB)
血红蛋白临床意义: 血红蛋白增高.降低的临床意义基本和红细胞计数的临床意义相似,但血红蛋白能更好地反映贫血的程度. 血红蛋白增多有以下情况: (1)生理性增多:见于高原居民.胎儿和新生儿,剧烈活动 ...
- 【python】变量的赋值、深浅拷贝
python——赋值与深浅拷贝 https://www.cnblogs.com/Eva-J/p/5534037.html 啥都不说,看这个博主的文章!
- springboot中添加热部署
<dependency> <!--Spring 官方提供的热部署插件 --> <groupId>org.springframework.boot</group ...
- js window.location用法
<script> //设置或获取 href 属性中跟在问号后面的部分. console.log(window.location.search)//设置或获取对象指定的文件名或路径conso ...
- 利用MYSQL的函数实现用户登录功能,进出都是JSON(第一版)
以HMAC密钥形式发放密钥令牌 功能如下 1:记录用户的登录的IP地址.时间 2:实现密码错误次数超限后锁定,并提示何时解锁 CREATE DEFINER=`root`@`%` FUNCTION `u ...
- python:数据类型list
一.列表list list是python中基础的数据类型之一,它是以[ ]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型 li = ['alex', 123, True, (1, 2, 3 ...
- MySQL之Haproxy+Keepalived+MySQL高可用均衡负载部署 (网络摘抄)
来源于:https://blog.csdn.net/weisong530624687/article/details/71536837?utm_source=blogxgwz3 一.安装主从MySQL ...
- C语言数据结构基础学习笔记——C语言基础
抽象数据类型(ADT)是指一个数学模型以及定义在该模型上的一组操作,通常用(数据对象,数据关系,基本操作集)这样的三元组来表示抽象数据类型. 数据结构是相互之间存在一种或多种特定关系的数据元素的集合, ...
- (转)EF5+SQLserver2012迁移到EF6+mysql5.5.47
原文地址:https://www.cnblogs.com/tinyjian/p/6235014.html:https://www.cnblogs.com/tinyjian/p/6235397.html ...