上篇讲解了单例模式 https://blog.csdn.net/lovelixue/article/details/81940996
现在来讲讲建造者模式
建造者模式的代码看起来有多舒服,这点我想对于一个开发来说,都是不言而喻的,以我用建造者模式做的一个demo来说
首先我新建一个Person类,有四种属性,这是普通类型的一个Person类
/**
* 普通的模式
* */
public class PersonTest {
private String name;//姓名(如果必选则需要final)
private int age;//年龄
private String sex;//性别
private String identity;//身份
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getIdentity() {
return identity;
}
public void setIdentity(String identity) {
this.identity = identity;
}
当我们需要这个person对象并且给他set值的时候,我们需要这样做
//普通模式获取PersonTest对象
PersonTest personTest = new PersonTest();
personTest.setName("候明天的雪");
personTest.setAge(18);
personTest.setSex("男");
personTest.setIdentity("码农");
这样看上去就比较累赘了,还有一种情况是直接添加多个构造的,构造里面传参数,需要什么参数就添加对应的构造,这种我就不贴代码了,非常累赘不说,代码看上去就很low,合格的码农都不会如此吧
以上是普通模式,接下来就看建造者模式来拿对象
同样的我先新建一个Person类,类里面代码的解析我都添加了
/**
* 建造者模式
* 需要什么属性就拿什么属性,以这个Person为例,不需要创建N个构造方法,增加代码可读性
* 最重要的是我们需要什么就点什么,开发起来身心愉悦
* */
public class Person {
private final String name;//姓名
private final int age;//年龄
private final String sex;//性别
private final String identity;//身份
private Person(PersonBuilder builder){
this.name = builder.name;
this.age = builder.age;
this.sex = builder.sex;
this.identity = builder.identity;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getSex() {
return sex;
}
public String getIdentity() {
return identity;
}
/**
* 创建PersonBuilder
* */
public static class PersonBuilder{
private final String name;//姓名(如果必选则需要final)
private int age;//年龄
private String sex;//性别
private String identity;//身份
/**
* 因为name是必选,所以添加一个带参name的构造
* */
public PersonBuilder(String name){
this.name = name;
}
public PersonBuilder setAge(int age) {
this.age = age;
return this;
}
public PersonBuilder setSex(String sex) {
this.sex = sex;
return this;
}
public PersonBuilder setIdentity(String identity) {
this.identity = identity;
return this;
}
//直接build返回person对象
public Person build(){
return new Person(this);
}
//添加限制条件再返回person对象
// public Person build(){
// //注意事项,先创建对象,再返回,因为PersonBuilder不是线程安全的,如果后创建对象,可能属性会被其他线程改变
// Person person = new Person(this);
// if (person.getAge()>100){
// throw new IllegalStateException("哥们,年龄这么大,你超神了");
// }
// return person;
// }
}
通过这个模式再来获取对象设值进去,来看看实现
//通过builder创建一个Person对象
Person person = new Person.PersonBuilder("候明天的雪")
.setAge(18)
.setSex("男")
.setIdentity("码农")
.build();
这样看代码是不是很简洁,逼格也瞬间上去了,这里面也有几点是值得讲解下的
- 用final修饰后,在构造里面就必须添加这个属性了,也就是说我们这个属性是必须的,在很多框架里面都有,比如glide的时候传入一个context之类的
- set方法是在builder里面,get则是在外面
- 返回对象的方式,可以直接返回一个Person对象,也可以加入条件(例如我注释掉的那部分代码)
好了,基本就这些了,当然这些知识基础的建造者模式实现,后面还有更多复杂而有趣的深层次内容等待我们探索