什么是建筑者模式
链接: 菜鸟教程之建造者模式.
建造者模式
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
建筑者模式的好处
意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,
其通常由各个部分的子对象用一定的算法构成;由于需求的变化,
这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
何时使用:一些基本部件不会变,而其组合经常变化的时候。
如何解决:将变与不变分离开。
关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
应用实例:
1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,
而其组合是经常变化的,生成出所谓的"套餐"。
2、JAVA 中的 StringBuilder。
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
如何使用建筑者模式
这里就拿闪送开发平台接口做个例子
原先的代码
public class SsOrderPlaceDTO {
/**
* 开发者appId(都有)
*/
private String clientId;
/**
* 签名(都有)
*/
private String sign;
/**
* 时间戳(都有)
*/
private long timestamp;
/**
* 业务入参(都有)
*/
private Data data;
/**
* token (授权型专有)
*/
private String accessToken;
/**
* 商户ID(大商户型专有)
*/
private String shopId;
public static class Data{
private String issOrderNo;
public String getIssOrderNo() {
return issOrderNo;
}
public void setIssOrderNo(String issOrderNo) {
this.issOrderNo = issOrderNo;
}
@Override
public String toString() {
return "Data{" +
"issOrderNo='" + issOrderNo + '\'' +
'}';
}
}
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public String getShopId() {
return shopId;
}
public void setShopId(String shopId) {
this.shopId = shopId;
}
public Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
@Override
public String toString() {
return "SsOrderPlaceDTO{" +
"clientId='" + clientId + '\'' +
", sign='" + sign + '\'' +
", timestamp='" + timestamp + '\'' +
", accessToken='" + accessToken + '\'' +
", shopId='" + shopId + '\'' +
", data=" + data +
'}';
}
}
public class Test {
/**
* 闪送签名方法
*/
public static String sign(){
// 省略....
return "sign";
}
/**
* 闪送提交订单接口
*/
public static void orderPlace(SsOrderPlaceDTO dto){
System.out.println(dto.toString());
// 业务逻辑省略.....
}
public static void main(String[] args) {
// 授权型
SsOrderPlaceDTO authorize = new SsOrderPlaceDTO();
SsOrderPlaceDTO.Data authorizeData = new SsOrderPlaceDTO.Data();
authorizeData.setIssOrderNo("授权型 IssOrderNo");
authorize.setData(authorizeData);
authorize.setAccessToken("授权型 AccessToken");
authorize.setClientId("授权型 ClientId");
authorize.setTimestamp(System.currentTimeMillis());
authorize.setSign(sign());
orderPlace(authorize);
// 大商户型
SsOrderPlaceDTO business = new SsOrderPlaceDTO();
SsOrderPlaceDTO.Data businessData = new SsOrderPlaceDTO.Data();
businessData.setIssOrderNo("大商户型 IssOrderNo");
business.setData(businessData);
business.setShopId("大商户型 ShopId");
business.setClientId("大商户型 ClientId");
business.setTimestamp(System.currentTimeMillis());
business.setSign(sign());
orderPlace(business);
}
}
使用建筑者模式的代码
package com.wkr.controller;
public class SsOrderPlaceDTO {
/**
* 开发者appId(都有)
*/
private String clientId;
/**
* 签名(都有)
*/
private String sign;
/**
* 时间戳(都有)
*/
private long timestamp;
/**
* 业务入参(都有)
*/
private Data data;
/**
* token (授权型专有)
*/
private String accessToken;
/**
* 商户ID(大商户型专有)
*/
private String shopId;
public static class Data{
private String issOrderNo;
public String getIssOrderNo() {
return issOrderNo;
}
public void setIssOrderNo(String issOrderNo) {
this.issOrderNo = issOrderNo;
}
@Override
public String toString() {
return "Data{" +
"issOrderNo='" + issOrderNo + '\'' +
'}';
}
}
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public String getShopId() {
return shopId;
}
public void setShopId(String shopId) {
this.shopId = shopId;
}
public Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
@Override
public String toString() {
return "SsOrderPlaceDTO{" +
"clientId='" + clientId + '\'' +
", sign='" + sign + '\'' +
", timestamp='" + timestamp + '\'' +
", accessToken='" + accessToken + '\'' +
", shopId='" + shopId + '\'' +
", data=" + data +
'}';
}
private SsOrderPlaceDTO(SsOrderPlaceDTO.Builder builder) {
this.clientId = builder.clientId;
this.sign = builder.sign;
this.timestamp = builder.timestamp;
this.accessToken = builder.accessToken;
this.shopId = builder.shopId;
this.data = builder.data;
}
public static final class Builder {
/**
* 开发者appId(都有)
*/
private String clientId;
/**
* 签名(都有)
*/
private String sign;
/**
* 时间戳(都有)
*/
private long timestamp;
/**
* 业务入参(都有)
*/
private Data data;
/**
* token (授权型专有)
*/
private String accessToken;
/**
* 商户ID(大商户型专有)
*/
private String shopId;
/**
* 通用的
*/
public Builder(String clientId, String IssOrderNo) {
this.clientId = clientId;
this.timestamp = System.currentTimeMillis();
SsOrderPlaceDTO.Data data = new SsOrderPlaceDTO.Data();
data.setIssOrderNo(IssOrderNo);
this.data = data;
}
/**
* 授权型 独有
*/
public SsOrderPlaceDTO.Builder authorize(String accessToken) {
this.accessToken = accessToken;
return this;
}
/**
* 大商户 独有
*/
public SsOrderPlaceDTO.Builder bigBusiness(String shopId) {
this.shopId = shopId;
return this;
}
/**
* 签名 都要进行签名
*/
private SsOrderPlaceDTO.Builder sign() {
this.sign = Test.sign();
return this;
}
public SsOrderPlaceDTO build() {
return new SsOrderPlaceDTO(sign());
}
}
}
public class Test {
/**
* 模拟的闪送签名方法
*/
public static String sign(){
// 省略....
return "sign";
}
/**
* 闪送提交订单接口
*/
public static void orderPlace(SsOrderPlaceDTO dto){
System.out.println(dto.toString());
// 业务逻辑省略.....
}
public static void main(String[] args) {
// 授权型
SsOrderPlaceDTO authorize = new SsOrderPlaceDTO
.Builder("授权型 ClientId","授权型 IssOrderNo")
.authorize("授权型 AccessToken")
.build();
orderPlace(authorize);
// 大商户型
SsOrderPlaceDTO business = new SsOrderPlaceDTO
.Builder("大商户型 ClientId","大商户型 IssOrderNo")
.bigBusiness("大商户型 ShopId")
.build();
orderPlace(business);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/133937.html