设计模式之建造者模式

定义是: 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示

这句话很空泛,很抽象,看这句话基本看不懂。

但是可以从上面知道,构建可以创建不同表示,那就是说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即可。

国家园林是一种造法,三层小楼也是一种造法,最重要的是住的舒心即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值