1、简介
本文讲述的是建造者模式的书写,Android中有AlertDialog和Notfacation是使用的建造者模式,建造者模式就是解决构造参数较多带来的传参问题的。通过set有用的参数来构造对象。
2、简易类型:
/**
* 建造的对象Person
*/
public class Person {
private int age;
private String name;
private String sex;
public void apply(PersonBuild.PersonParams params){
this.age = params.age;
this.name = params.name;
this.sex = params.sex;
}
@Override
public String toString() {
return "姓名 "+name+"\n"
+"年龄 "+age+"\n"
+"性别 "+sex;
}
}
/**
* 建造对象的工厂
*/
public class PersonBuild {
private PersonParams personParams;
private Person person;
public PersonBuild() {
this.personParams = new PersonParams();
person = new Person();
}
public PersonBuild setAge(int age){
personParams.age = age;
return this;
}
public PersonBuild setName(String name){
personParams.name = name;
return this;
}
public PersonBuild setSex(String sex){
personParams.sex = sex;
return this;
}
// 调用该方法才创建对象
public Person build(){
person.apply(personParams);
return person;
}
/* 内部类 属性与对象一致*/
class PersonParams {
public int age;
public String name;
public String sex;
}
}
public class Client {
public static void main(String[] args){
Person person = new PersonBuild()
.setName("小李")
.setSex("男")
.build();
System.out.println(person);
}
}
/*
姓名 小李
年龄 0
性别 男
*/
3、究极变形,推荐:
public class Person {
private String name;
private String sex;
private int age = -1;
public Person(PersonBuild personBuild){
if (personBuild.age != -1){
age = personBuild.age;
}
if (personBuild.sex != null){
sex = personBuild.sex;
}
if (personBuild.name != null){
name = personBuild.name;
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
if (name != null && !name.isEmpty()){
sb.append("姓名: ").append(name).append(" ");
}
if (sex !=null && !sex.isEmpty()){
sb.append("性别: ").append(sex).append(" ");
}
if (age != -1){
sb.append("年龄: ").append(String.valueOf(age)).append(" ");
}
return sb.toString();
}
public static class PersonBuild{
private String name;
private String sex;
private int age = -1;
public PersonBuild setName(String name){
this.name = name;
return this;
}
public PersonBuild setSex(String sex){
this.sex = sex;
return this;
}
PersonBuild setAge(int age){
this.age = age;
return this;
}
// 构建对象的时候再传递入内
Person build(){
return new Person(this);
}
}
}
public class Client {
public static void main(String[] args){
Person person = new Person.PersonBuild().setName("小王").setAge(15).build();
System.out.println(person);
}
}
//姓名: 小王 年龄: 15