概念
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
建造者模式主要包含四个角色:
- 产品(product):要创建的产品类对象
- 建造者抽象(builder):建造者的抽象类,规范产品对象的各个组成部分的建造,一般由子类实现具体的建造过程
- 建造者(concreteBuilder):具体的builder类,根据不同的业务逻辑,具体化对象的各个组成部分的创建
- 调用者(director):调用具体的创建者,来创建对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按照某种顺序创建
实现
1.创建产品
@Data
public class Product {
private String name;
private String coke;
private String burger;
private String chicken;
@Override
public String toString() {
return "Product{" +
"name='" + name + '\'' +
", coke='" + coke + '\'' +
", burger='" + burger + '\'' +
", chicken='" + chicken + '\'' +
'}';
}
}
2.创建建造者
public class ConcreteBuilder {
private Product product=new Product();
public Product builder() {
return product;
}
public ConcreteBuilder addName(String name){
product.setName(name);
return this;
}
public ConcreteBuilder addCoke(String coke){
product.setCoke(coke);
return this;
}
public ConcreteBuilder addBurger(String burger){
product.setBurger(burger);
return this;
}
public ConcreteBuilder addChicken(String chicken){
product.setChicken(chicken);
return this;
}
@Data
public class Product {
private String name;
private String coke;
private String burger;
private String chicken;
@Override
public String toString() {
return "Product{" +
"name='" + name + '\'' +
", coke='" + coke + '\'' +
", burger='" + burger + '\'' +
", chicken='" + chicken + '\'' +
'}';
}
}
}
3.创建调用者
public class Director {
public static void main(String[] args) {
ConcreteBuilder builder=new ConcreteBuilder().
addName("肯德基全家桶").
addChicken("炸鸡腿").
addBurger("汉堡").
addCoke("可乐");
System.out.println(builder.builder());
}
}
运行结果:
在源码中的使用
在spring IOC过程中,xml、application等文件中的对象都是通过BeanDefinitionBuilder类调用getBeanDefinition() 方法,获得一个AbstractBeanDefinition 对象,放到IOC容器中
BeanDefinitionBuilder.java
public class BeanDefinitionBuilder {
public AbstractBeanDefinition getBeanDefinition() {
this.beanDefinition.validate();
return this.beanDefinition;
}
public BeanDefinitionBuilder setParentName(String parentName) {
this.beanDefinition.setParentName(parentName);
return this;
}
public BeanDefinitionBuilder setFactoryMethod(String factoryMethod) {
this.beanDefinition.setFactoryMethodName(factoryMethod);
return this;
}
public BeanDefinitionBuilder setFactoryMethodOnBean(String factoryMethod, String factoryBean) {
this.beanDefinition.setFactoryMethodName(factoryMethod);
this.beanDefinition.setFactoryBeanName(factoryBean);
return this;
}
public BeanDefinitionBuilder addConstructorArgValue(@Nullable Object value) {
this.beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(
this.constructorArgIndex++, value);
return this;
}
public BeanDefinitionBuilder addConstructorArgReference(String beanName) {
this.beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(
this.constructorArgIndex++, new RuntimeBeanReference(beanName));
return this;
}
public BeanDefinitionBuilder addPropertyValue(String name, @Nullable Object value) {
this.beanDefinition.getPropertyValues().add(name, value);
return this;
}
public BeanDefinitionBuilder addPropertyReference(String name, String beanName) {
this.beanDefinition.getPropertyValues().add(name, new RuntimeBeanReference(beanName));
return this;
}
public BeanDefinitionBuilder setInitMethodName(@Nullable String methodName) {
this.beanDefinition.setInitMethodName(methodName);
return this;
}
public BeanDefinitionBuilder setDestroyMethodName(@Nullable String methodName) {
this.beanDefinition.setDestroyMethodName(methodName);
return this;
}
public BeanDefinitionBuilder setScope(@Nullable String scope) {
this.beanDefinition.setScope(scope);
return this;
public BeanDefinitionBuilder setAbstract(boolean flag) {
this.beanDefinition.setAbstract(flag);
return this;
}
public BeanDefinitionBuilder setLazyInit(boolean lazy) {
this.beanDefinition.setLazyInit(lazy);
return this;
}
public BeanDefinitionBuilder setAutowireMode(int autowireMode) {
beanDefinition.setAutowireMode(autowireMode);
return this;
}
...
}
建造者模式与工厂模式的区别
- 建造者模式更加注重方法的调用顺序,工厂模式注重创建对象
- 创建对象的力度不同。建造者模式创建复杂的对象,由各种复杂部件组成,工厂模式创建出来的都一样
- 关注点不一样。工厂模式只需要把对象创建出来就可以,而建造者模式需要知道这个对象由哪些部件组成
总结
优点
- 建造者独立,易扩展
- 便于控制细节风险
缺点
- 产品必须有共同点
- 如果内部复杂,会有需要Builder对象
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/12911.html