1.模式定义:将一个复杂对象的创建与他的表示分离,使得同样的构建过程可以创建不同的表示

2.标准的建造者代码

如下,假如要组装品牌电脑,组装可以用很多不同厂商的硬件,而且组装的先后顺序也会不同,那么这样一个复杂的类如果由我们在new的时候处理的话那就很麻烦了,面对这种复杂的情况我们就应该用建造者模式。
比如我们可以抽象一个建造方法接口出来,让不同的建造者去实现组装,如下面的Apple建造者,当然我们也还可以再创建一个华为的建造者出来。
让建造者按照自己厂商的要求去实现品牌的生产组装,我们用的时候调用ProductBuilder去获得一台所想要的品牌组装电脑就可以了。

  1. class Product{
  2. public String productName;
  3. public String companyName;
  4. public String mainBoard; //1.先安装主板,当然这里的顺序并不是固定的,只是做一个假设
  5. public String cpu; //2.再安装cpu,当然这里的顺序并不是固定的,只是做一个假设
  6. public String memory; //3.再安装内存,当然这里的顺序并不是固定的,只是做一个假设
  7. }
  8. interface ProductBuilder{
  9. void builderProductName(String productName);
  10. void builderProductCompanyName(String companyName);
  11. void builderMainBoard(String mainBoard);
  12. void builderCPU(String cpu);
  13. void builderMemory(String memory);
  14. Product build();
  15. }
  16. class AppleConCreateProductBuilder implements ProductBuilder{
  17. private Product product = new Product();
  18. @Override
  19. public void builderProductName(String productName) {
  20. this.product.productName = productName;
  21. }
  22. @Override
  23. public void builderProductCompanyName(String companyName) {
  24. this.product.companyName = companyName;
  25. }
  26. @Override
  27. public void builderMainBoard(String mainBoard) {
  28. this.product.mainBoard = mainBoard;
  29. }
  30. @Override
  31. public void builderCPU(String cpu) {
  32. this.product.cpu = cpu;
  33. }
  34. @Override
  35. public void builderMemory(String memory) {
  36. this.product.memory = memory;
  37. }
  38. @Override
  39. public Product build() {
  40. return this.product;
  41. }
  42. }
  43. class Director{ //经理,监督建造
  44. private ProductBuilder builder;
  45. public Director(ProductBuilder productBuilder){
  46. this.builder = productBuilder;
  47. }
  48. public Product buildProduct(String productName,String companyName,String mainBoard,String cpu,String memory){
  49. builder.builderProductName(productName);
  50. builder.builderProductCompanyName(companyName);
  51. builder.builderCPU(mainBoard);
  52. builder.builderMainBoard(cpu);
  53. builder.builderMemory(memory);
  54. return builder.build();
  55. }
  56. }
  57. public class BuilderTest {
  58. public static void main(String[] args) {
  59. ProductBuilder productBuilder = new AppleConCreateProductBuilder();
  60. Director director = new Director(productBuilder);
  61. Product product = director.buildProduct("macBookAir12","apple","jiJia","m1","32G");
  62. System.out.println(product);
  63. }
  64. }

3.上面的版本是比较复杂的一个版本,其实可以简化,代码如下:

  1. class Product{
  2. public final String productName;
  3. public final String companyName;
  4. public final String mainBoard; //1.先安装主板
  5. public final String cpu; //2.再安装cpu
  6. public final String memory; //3.再安装内存
  7. public Product(String productName,String companyName,String mainBoard,String cpu,String memory){
  8. this.productName = productName;
  9. this.companyName = companyName;
  10. this.mainBoard = mainBoard;
  11. this.cpu = cpu;
  12. this.memory = memory;
  13. }
  14. public Product build(){
  15. /*
  16. 在这里实现组装操作
  17. */
  18. return this;
  19. }
  20. }
  21. public class BuilderTest {
  22. public static void main(String[] args) {
  23. Product product = new Product("macBookAir12","apple","jiJia","m1","32G").build();
  24. System.out.println(product);
  25. }
  26. }

应用场景
1.需要生成的对象具有复杂的内部结构
2.需要生成的对象内部属性本身相互依赖
3.与不可变对象配合使用

优点:
1、建造者独立,易扩展。
2、便于控制细节风险。

Spring源码中的应用
1.org.springframework.web.servlet.mvc.method.RequestMappingInfo
2.org.springframework.beans.factory.support.BeanDefinitionBuilder