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;
}