今天来给大家分享以下建造者模式
什么是建造者模式呢,我不用太官方的语言给大家表示
首先建造就是指创建复杂对象,像如果一个类中有相当多的属性,且这些属性有些需要赋值,有些不需要,那么像我们之前可能会使用set方法进行设置,比如下面这样
我们的Person类,
public class Person {
private String name; //姓名
private String age; //年龄
private String sex; //性别
private String height; //身高
private String weight; //体重
//省略了set方法和toString方法。
}
测试代码
public class Test {
public static void main(String[] args) {
Person person =new Person();
person.setName("张三");
person.setAge("18");
person.setSex("男");
person.setHeight("185");
person.setWeight("140");
System.out.println(person);
}
}
我们使用大段的set方法,阅读起来也有点不舒服,此时像这种属性很多且赋值情况很多的类,我们就可以使用建造者模式+链式写法+静态内部类来实现
改造Person类
public class Person {
private String name; //姓名
private String age; //年龄
private String sex; //性别
private String height; //身高
private String weight; //体重
//省略了set和toString方法
public static class Builder{
//静态内部类Builder内部持有一个person对象,调用person的set方法
private Person person =new Person();
public Builder name(String name) {
person.setName(name);
return this;
}
public Builder age(String age) {
person.setAge(age);
return this;
}
public Builder sex(String sex) {
person.setSex(sex);
return this;
}
public Builder height(String height) {
person.setHeight(height);
return this;
}
public Builder weight(String weight) {
person.setWeight(weight);
return this;
}
//最后通过一个builder方法返回person对象
public Person builder() {
return person;
}
}
}
再看我们的测试代码
public class Test {
public static void main(String[] args) {
Person person=new Person.Builder()
.name("张三")
.age("18")
.sex("男")
.height("185")
.weight("140")
.builder();
System.out.println(person);
}
}
虽然我们的Person类内部的代码增多了,但是换来的客户端调用的代码是简洁了许多,并且,这样的代码格式大家一定在自己的编程过程中也遇到过。比如在Mybatis用注解实现动态SQL的时候,需要创建一个类,类中写方法然后返回SQL语句,比如
public String insertUserInfo(UserInfo ui) {
return new SQL() {
{
INSERT_INTO("user_info");
if(ui.getUserName()!=null) {
VALUES("userName","#{userName}");
}
if(ui.getPassword()!=null) {
VALUES("password","#{password}");
}
}
}.toString();
}
还记得大三学习安卓的时候,里面一个AlertDialog对话框,其实这个类内部的也是建造者模式。
还记得我当初工厂那篇文章吗,我说工厂就是来创造东西的,咱们创造空调,而今天的建造者模式也是来创建东西的,那么他们的区别在哪里呢?以下是我个人的见解
虽然两者都是创造对象,
工厂注重创建结果,注重的是一个产品结果产出
建造者注重创建过程,注重的是这个产品创建过程中属性情况
就如空调的那个例子,从工厂的产品线上出来的空调都是格力空调,但是各个产品线的不同,就会创建不同的空调。
希望大家能从我的介绍中获得一定的收获,大家可以用我的代码复制回去运行一下,细细体会建造者模式在创建复杂对象过程中的优势,并能分辨出和工厂模式的区别