设计模式是面向问题、场景而总结产生的设计思路。是解决问题的套路。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、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。