小白自学设计模式之建造者模式

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 

猜你喜欢

转载自blog.csdn.net/crazyZhangxl/article/details/80708047