• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
gaohuan30
博客园    首页    新随笔    联系   管理    订阅  订阅
建造者模式(Builder)

Builder建造者模式

​ 将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建他们最后构建成该复杂对象。

dome1

package org.huangao.ma.builder.dome1;
// 计算机类
public class Computer {
    /** CPU */
    private String cpu;
    /** 内存 */
    private String memory;
    /** 硬盘 */
    private String hardDisk;
    /** 键盘 */
    private String keyboard;
    /** 鼠标 */
    private String mouse;

    @Override
    public String toString() {
        return "Computer{" +
                "cpu='" + cpu + '\'' +
                ", memory='" + memory + '\'' +
                ", hardDisk='" + hardDisk + '\'' +
                ", keyboard='" + keyboard + '\'' +
                ", mouse='" + mouse + '\'' +
                '}';
    }

    public String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public String getMemory() {
        return memory;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }

    public String getHardDisk() {
        return hardDisk;
    }

    public void setHardDisk(String hardDisk) {
        this.hardDisk = hardDisk;
    }

    public String getKeyboard() {
        return keyboard;
    }

    public void setKeyboard(String keyboard) {
        this.keyboard = keyboard;
    }

    public String getMouse() {
        return mouse;
    }

    public void setMouse(String mouse) {
        this.mouse = mouse;
    }
}
// 组装接口
public interface ComputerConfigBuilder {
    void setCPU();

    void setMemery();

    void setHardDisk();

    void setKeyboard();

    void setMouse();

    Computer getComputer();
}
package org.huangao.ma.builder.dome1;

/**
 * 低配版电脑
 */
public class LowComputerBuilder implements ComputerConfigBuilder {

    private Computer computer;

    public LowComputerBuilder(Computer computer) {
        this.computer = computer;
    }

    @Override
    public void setCPU() {
        computer.setCpu("i5");
    }

    @Override
    public void setMemery() {
        computer.setMemory("8G");
    }

    @Override
    public void setHardDisk() {
        computer.setHardDisk("500G");
    }

    @Override
    public void setKeyboard() {
        computer.setKeyboard("脆薄键盘");
    }

    @Override
    public void setMouse() {
        computer.setMouse("出厂标配鼠标");
    }

    @Override
    public Computer getComputer() {
        return computer;
    }
}
package org.huangao.ma.builder.dome1;

/**
 * 高配配版电脑
 */
public class HighComputerBuilder implements ComputerConfigBuilder {

    private Computer computer;

    public HighComputerBuilder(Computer computer) {
        this.computer = computer;
    }

    @Override
    public void setCPU() {
        computer.setCpu("i7");
    }

    @Override
    public void setMemery() {
        computer.setMemory("16G");
    }

    @Override
    public void setHardDisk() {
        computer.setHardDisk("1t");
    }

    @Override
    public void setKeyboard() {
        computer.setKeyboard("蝴蝶键盘");
    }

    @Override
    public void setMouse() {
        computer.setMouse("雷蛇鼠标");
    }

    @Override
    public Computer getComputer() {
        return computer;
    }
}
package org.huangao.ma.builder.dome1;

public class Director {
    private ComputerConfigBuilder builder;


    public void setBuilder(ComputerConfigBuilder builder) {
        this.builder = builder;
    }

    public void createComputer() {
        builder.setCPU();
        builder.setMemery();
        builder.setHardDisk();
        builder.setKeyboard();
        builder.setMouse();
    }

    public Computer getComputer() {
        return builder.getComputer();
    }

    public static void main(String[] args) {
        // 创建一位装机员
        Director director = new Director();
        // 告诉 装机员低配
        director.setBuilder(new LowComputerBuilder(new Computer()));
        director.createComputer();
        System.out.println(String.format("低配计算机为 -> %s", director.getComputer()));
        // 低配计算机为 -> Computer{cpu='i5', memory='8G', hardDisk='500G', keyboard='脆薄键盘', mouse='出厂标配鼠标'}

        // 高配
        director.setBuilder(new HighComputerBuilder(new Computer()));
        director.createComputer();
        System.out.println(String.format("高配计算机为 -> %s", director.getComputer()));
        // 高配计算机为 -> Computer{cpu='i7', memory='16G', hardDisk='1t', keyboard='蝴蝶键盘', mouse='雷蛇鼠标'}
    }
}

dome2-Builder的变种

package org.huangao.ma.builder.dome2;

public class Person {
    /* 姓名 (必填)  */
    public String name;
    /* 性别 (必填)  */
    public String gender;
    /* 年龄 (非必填)  */
    public String age;
    /* 鞋子 (非必填)  */
    public String shoes;
    /* 衣服 (非必填)  */
    public String clothes;
    /* 钱 (非必填)  */
    public String money;
    /* 房子 (非必填)  */
    public String house;
    /* 汽车 (非必填)  */
    public String car;
    /* 职业 (非必填)  */
    public String career;
    /* 媳妇 (非必填)  */
    public String wife;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", age='" + age + '\'' +
                ", shoes='" + shoes + '\'' +
                ", clothes='" + clothes + '\'' +
                ", money='" + money + '\'' +
                ", house='" + house + '\'' +
                ", car='" + car + '\'' +
                ", career='" + career + '\'' +
                ", wife='" + wife + '\'' +
                '}';
    }

    public static class Builder {
        Person p = new Person();


        public Builder(String name, String age) {
            p.setName(name);
            p.setAge(age);
        }

        public Builder name(String name) {
            p.setName(name);
            return this;
        }

        public Builder gender(String gender) {
            p.setGender(gender);
            return this;
        }

        public Builder age(String age) {
            p.setAge(age);
            return this;
        }

        public Builder shoes(String shoes) {
            p.setShoes(shoes);
            return this;
        }

        public Builder clothes(String clothes) {
            p.setClothes(clothes);
            return this;
        }

        public Builder money(String money) {
            p.setMoney(money);
            return this;
        }

        public Builder house(String house) {
            p.setHouse(house);
            return this;
        }

        public Builder car(String car) {
            p.setCar(car);
            return this;
        }

        public Builder career(String career) {
            p.setCareer(career);
            return this;
        }

        public Person build() {
            return p;
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getShoes() {
        return shoes;
    }

    public void setShoes(String shoes) {
        this.shoes = shoes;
    }

    public String getClothes() {
        return clothes;
    }

    public void setClothes(String clothes) {
        this.clothes = clothes;
    }

    public String getMoney() {
        return money;
    }

    public void setMoney(String money) {
        this.money = money;
    }

    public String getHouse() {
        return house;
    }

    public void setHouse(String house) {
        this.house = house;
    }

    public String getCar() {
        return car;
    }

    public void setCar(String car) {
        this.car = car;
    }

    public String getCareer() {
        return career;
    }

    public void setCareer(String career) {
        this.career = career;
    }

    public String getWife() {
        return wife;
    }

    public void setWife(String wife) {
        this.wife = wife;
    }
}
package org.huangao.ma.builder.dome2;

public class Test2 {
    public static void main(String[] args) {
        Person person = new Person.Builder("小明", "15")
                .car("自行车")
                .build();
        System.out.println(person);
        // Person{name='小明', gender='null', age='15', shoes='null', clothes='null', money='null', house='null', car='自行车', career='null', wife='null'}
    }
}

dome3-lombok注解

@Data
@Builder
public class User {
    private String name;
    private int age;
    private String car;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", car='" + car + '\'' +
                '}';
    }
}
public class Test3 {
    public static void main(String[] args) {
        User user = User.builder().age(18).car("摩托车").name("小红").build();
        System.out.println(user);
        // User{name='小红', age=18, car='摩托车'}
    }
}

dome4-Spring中的应用(BeanDefinitionBuilder)

组建一个 BeanDefinition 对象 注册到容器中

@Component
public class MyBeanDefinitionRegistryPostProceeeor3 implements BeanDefinitionRegistryPostProcessor{
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        System.out.println("MyBeanDefinitionRegistryPostProceeeor3");
        // 定义一个字符串类型的bean
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.
                genericBeanDefinition(String.class).
                addConstructorArgValue("没有排序").
                getBeanDefinition();
        registry.registerBeanDefinition("userName3",beanDefinition);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

    }

}

内部使用的其实都是AbstractBeanDefinition对象对内部参数进行set

	public static BeanDefinitionBuilder genericBeanDefinition(Class<?> beanClass) {
		BeanDefinitionBuilder builder = new BeanDefinitionBuilder(new GenericBeanDefinition());
		builder.beanDefinition.setBeanClass(beanClass);
		return builder;
	}
posted on 2020-05-27 22:14  gaohuan30  阅读(243)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3