常见的设计模式之建造者模式

导读:本篇文章讲解 常见的设计模式之建造者模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

概念

建造者模式(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;
	}
	...
}	

建造者模式与工厂模式的区别

  1. 建造者模式更加注重方法的调用顺序,工厂模式注重创建对象
  2. 创建对象的力度不同。建造者模式创建复杂的对象,由各种复杂部件组成,工厂模式创建出来的都一样
  3. 关注点不一样。工厂模式只需要把对象创建出来就可以,而建造者模式需要知道这个对象由哪些部件组成

总结

优点

  1. 建造者独立,易扩展
  2. 便于控制细节风险

缺点

  1. 产品必须有共同点
  2. 如果内部复杂,会有需要Builder对象

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/12911.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!