三、建造者模式——麦当劳的配餐服务


设计模式是面向问题、场景而总结产生的设计思路。是解决问题的套路。23 种经典的设计模式。它们又可以分为三大类:创建型、结构型、行为型。

创建型 包含了 单例模式、工厂模式、建造者模式、原型模式。

1. 建造者模式

假设:
设计一个配置类Config,这个类包含十多个属性。
在构造这个类的时候通过构造函数,会出现组合爆炸的情况。

  • 方法1,设计一个大而全的构造函数,在调用构造函数时,对不需要的属性设置为Null,那么就需要在构造函数里对Null的属性进行判断和处理。
  • 方法2,通过默认构造函数创建一个对象后,再通过set方法去赋值。但set赋值需要多次调用,且set的顺序以及判定逻辑就交给了对象的使用者,不太友好。
  • 方法1和方法2还有一个问题。如果这些属性之间有关联, 需要同时设置,比如连接池常见的参数最大连接数、最小连接数、最大空闲连接数,一般需要同时设置。那么set时还容易漏掉,容易出错且不方便。

那么就考虑使用建造者模式吧。

public class Config {

	private int max_conn;
	private int min_conn;
	private int max_idle;
	private int max_timeout;
	private int max_retries;
	
	public Config(Builder builder) {
		max_conn = builder.max_conn;
		min_conn = builder.min_conn;
		max_idle = builder.max_idle ;
		max_timeout= builder.max_timeout;
		max_retries= builder.max_retries;
	}

	@Override
	public String toString() {
		return "Config{" +
				"max_conn=" + max_conn +
				", min_conn=" + min_conn +
				", max_idle=" + max_idle +
				", max_timeout=" + max_timeout +
				", max_retries=" + max_retries +
				'}';
	}

	public static class Builder{
	
		private int max_conn;
		private int min_conn;
		private int max_idle;
		private int max_timeout;
		private int max_retries;	
		
		public Config build() {
			if(max_conn<min_conn) throw new IllegalArgumentException("参数错误");
			return new Config(this);
		}
		
		public Builder setConn(int max_conn,int min_conn,int max_idle){
			this.max_conn = max_conn;
			this.min_conn = min_conn;
			this.max_idle = max_idle;
			return this;
		}
		
		public Builder setTimeOut(int max_timeout,int max_retries) {
			this.max_timeout= max_timeout;
			this.max_retries= max_retries;
			return this;
		}
	}
}

那么使用的时候很简单,可以使用链式调用。

public class Main {
    public static void main(String[] args) {
        Config cfg = new Config.Builder().setConn(10,2,1).setTimeOut(60,3).build();
        System.out.println(cfg);
    }
}

运行结果显示

Config{max_conn=10, min_conn=2, max_idle=1, max_timeout=60, max_retries=3}

总结

建造者模式就像一位厨师,在你点餐的时候会给你搭配薯条和番茄酱,给你炸鸡和啤酒,然后不断的放在你的餐盘上,最后送到你面前。

设计模式系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/designpattern
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值