设计模式之建造者模式
定义是: 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示
这句话很空泛,很抽象,看这句话基本看不懂。
但是可以从上面知道,构建可以创建不同表示,那就是说new一个对象出来,有不同的结果呗。
一般方式
那么下面就看这个类,
/**
* @author lw
* @date 2022/3/28 0028
* @description 短信发送
*/
@Data
public class SmsSender {
//移动发送短信需要的入网条件
private String smsKey;
private String smsAccess;
//可以选择的入网条件
private String netType; //网络类型
private String worker;
private String smsType; //短信类型 立即短信、队列短信等
//下面省略十几个其他参数
/**
* 对于必要的参数
* @param smsKey
* @param smsAccess
*/
public SmsSender(String smsKey,String smsAccess){
this.smsAccess = smsAccess;
this.smsKey = smsKey;
}
public SmsSender(String smsKey,String smsAccess,String netType){
this(smsKey,smsAccess);
this.netType = netType;
}
public SmsSender(String smsKey,String smsAccess,String netType,String smsType){
this(smsKey,smsAccess,netType);
this.smsType = smsType;
}
public void send(String content) {
System.out.println("短信发送:"+content);
}
//省略getter/setter方法
}
这个SmsSender类有三个构造函数,new SmsSender() 传入的数据不同,构造出来的东西也不同。
那么这是不是也是一个建造者模式呢?
如果要调用发送短信,那么如下,
String smsKey = null;
String smsAccess = null;
String netType = null; //网络类型
String worker = null;
String smsType = null;
SmsSender sender = new SmsSender(smsKey, smsAccess);
sender.setNetType(netType);
sender.setSmsType(smsType);
sender.setWorker(worker);
sender.send("hello world");
我觉得至今为止我遇到的项目基本都是上面这种方式,new一个对象出来,然后用setter方法设置不同的属性,而SmsSender有各种构造函数,以供你new对象时传参。
不谈那些什么传统建造者模式啊,也不说什么是建造者模式,就说每次使用上面这种调用,要么在new对象传入一大堆参数,要么就是setter一堆。
简单建造者方式
可不可以改写一下SmsSender呢?
调用方式,
String smsKey = null;
String smsAccess = null;
String netType = null; //网络类型
String worker = null;
String smsType = null;
SmsSender sender = new SmsSender
.SmsBuilder(smsKey,smsAccess)
.setNetType(netType)
.setSmsType(smsType)
.build();
sender.send("hello world");
上面这种调用方式如果在写网络编程或者quartz时,经常会遇到这种链式调用,而这种也是在SmsSender中创建一个构造者,所有的数据都由SmsBuilder设置。
@Data
public class SmsSender {
//移动发送短信需要的入网条件
private String smsKey;
private String smsAccess;
//可以选择的入网条件
private String netType; //网络类型
private String worker;
private String smsType; //短信类型 立即短信、队列短信等
//下面省略十几个其他参数
public SmsSender(SmsBuilder smsBuilder) {
this.smsAccess = smsBuilder.smsAccess;
this.smsKey = smsBuilder.smsKey;
this.netType = smsBuilder.netType;
this.worker = smsBuilder.worker;
this.smsType = smsBuilder.smsType;
}
public void send(String content) {
System.out.println("短信发送:" + content);
}
/**
构造者
*/
public static class SmsBuilder {
//移动发送短信需要的入网条件
private String smsKey;
private String smsAccess;
//可以选择的入网条件
private String netType; //网络类型
private String worker;
private String smsType; //短信类型 立即短信、队列短信等
public SmsBuilder(String smsKey, String smsAccess) {
this.smsAccess = smsAccess;
this.smsKey = smsKey;
}
public SmsBuilder setNetType(String netType) {
this.netType = netType;
return this;
}
public SmsBuilder setWorker(String worker) {
this.worker = worker;
return this;
}
public SmsBuilder setSmsType(String smsType) {
this.smsType = smsType;
return this;
}
public SmsSender build() {
return new SmsSender(this);
}
}
}
这种方式不说设计方面,在代码量上其实工作量也不小,一般也就是看中链式调用比较方便。
至于传统的使用Director的这种建造者模式,我是一次都没用过,写了以后一般其他人都不理解,而且代码量更多。
一个代码写出来如果太多,太复杂,那么基本很难维护,你要知道写的是你,维护的不一定是你,别人不理解还怎么维护。
四不像模式
@Data
public class SmsSender {
//移动发送短信需要的入网条件
private String smsKey;
private String smsAccess;
//可以选择的入网条件
private String netType; //网络类型
private String worker;
private String smsType; //短信类型 立即短信、队列短信等
//下面省略十几个其他参数
public SmsSender(String smsKey,String smsAccess){
this.smsAccess = smsAccess;
this.smsKey = smsKey;
}
public void send(String content) {
System.out.println("短信发送:" + content);
}
public SmsSender setNetType(String netType){
this.netType = netType;
return this;
}
public SmsSender setWorker(String worker){
this.worker = worker;
return this;
}
public SmsSender setSmsType(String smsType){
this.smsType = smsType;
return this;
}
}
对于比较常用的可选参数,netType、worker和smsType,我都喜欢设置如上这种返回 SmsSender的setter方法,就是为了链式调用。
调用方式,
SmsSender sender = new SmsSender(smsKey, smsAccess)
.setNetType(netType)
.setSmsType(smsType)
.setWorker(worker);
对于建造者模式只能说一般很少用,基本getter,setter即可。
国家园林是一种造法,三层小楼也是一种造法,最重要的是住的舒心即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?