一、建造者模式定义
1.建造者模式是将一个复杂对象的构建过程与它的表示分离,使得同样的过程可以创建不同的表示,属于创建型模式。使用建造者模式对于用户而言只需指定需要建造的类型就可以获得对象,建造过程及细节不需要了解。
2.建造者模式适用于创建对象需要很多步骤,但是步骤的顺序不一定固定。如果一个对象有非常复杂的内部结构(很多属性),可以将复杂对象的创建和适用进行分离。
3.建造者模式中主要有四个角色
A.产品:要创建的产品类对象
B.建造者抽象(Builder):建造者的抽象类,规范产品对象的各个组成部分的建造,一般由子类实现具体的构建过程
C.建造者(ConcreteBuilder):具体的Builder类,根据不同的业务逻辑,具体化对象的各个组成部分的创建
D.调用者(Director):调用具体的建造者,来创建对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建
4.建造者模式的适用场景:建造者模式适用于一个具有较多的零件的复杂产品的创建过程,由于需求的变化,组成这个复杂产品的各个零件经常猛烈变化,但是它们的组合方式却相对稳定
A.相同的方法,不同的执行顺序,产生不同的结果时
B.多个部件或零件,都可以装配到一个对象中,但产生的结果又不相同
C.产品类非常复杂,或者产品类中的调用顺序不同产生不同的作用
D.当初始化一个对象特别复杂,参数多,而且很多参数都有默认值时
5.建造者模式基本写法
1 /** 2 * Product.java 3 * 产品(房子) 4 */ 5 public class Product { 6 private String buildA; 7 private String buildB; 8 private String buildC; 9 private String buildD; 10 public String getBuildA() { 11 return buildA; 12 } 13 public void setBuildA(String buildA) { 14 this.buildA = buildA; 15 } 16 public String getBuildB() { 17 return buildB; 18 } 19 public void setBuildB(String buildB) { 20 this.buildB = buildB; 21 } 22 public String getBuildC() { 23 return buildC; 24 } 25 public void setBuildC(String buildC) { 26 this.buildC = buildC; 27 } 28 public String getBuildD() { 29 return buildD; 30 } 31 public void setBuildD(String buildD) { 32 this.buildD = buildD; 33 } 34 @Override 35 public String toString() { 36 return buildA+"\n"+buildB+"\n"+buildC+"\n"+buildD+"\n"+"房子验收完成"; 37 } 38 } 39 40 41 /** 42 * Builder.java 43 * 建造者 44 */ 45 public abstract class Builder { 46 //地基 47 abstract void bulidA(); 48 //钢筋工程 49 abstract void bulidB(); 50 //铺电线 51 abstract void bulidC(); 52 //粉刷 53 abstract void bulidD(); 54 //完工-获取产品 55 abstract Product getProduct(); 56 } 57 58 /** 59 * ConcreteBuilder.java 60 * 具体建造者(工人) 61 */ 62 public class ConcreteBuilder extends Builder{ 63 private Product product; 64 public ConcreteBuilder() { 65 product = new Product(); 66 } 67 @Override 68 void bulidA() { 69 product.setBuildA("地基"); 70 } 71 @Override 72 void bulidB() { 73 product.setBuildB("钢筋工程"); 74 } 75 @Override 76 void bulidC() { 77 product.setBuildC("铺电线"); 78 } 79 @Override 80 void bulidD() { 81 product.setBuildD("粉刷"); 82 } 83 @Override 84 Product getProduct() { 85 return product; 86 } 87 } 88 89 /** 90 * Director.java 91 * 指挥者 92 */ 93 public class Director { 94 //指挥工人按顺序造房 95 public Product create(Builder builder) { 96 builder.bulidA(); 97 builder.bulidB(); 98 builder.bulidC(); 99 builder.bulidD(); 100 return builder.getProduct(); 101 } 102 } 103 104 public class BuilderTest { 105 106 public static void main(String[] args) { 107 Director director = new Director(); 108 Product create = director.create(new ConcreteBuilder()); 109 System.out.println(create.toString()); 110 } 111 }
6.建造者模式的链式写法
1 /** 2 * Product.java 3 * 产品(房子) 4 */ 5 public class Product { 6 private String buildA; 7 private String buildB; 8 private String buildC; 9 private String buildD; 10 public String getBuildA() { 11 return buildA; 12 } 13 public void setBuildA(String buildA) { 14 this.buildA = buildA; 15 } 16 public String getBuildB() { 17 return buildB; 18 } 19 public void setBuildB(String buildB) { 20 this.buildB = buildB; 21 } 22 public String getBuildC() { 23 return buildC; 24 } 25 public void setBuildC(String buildC) { 26 this.buildC = buildC; 27 } 28 public String getBuildD() { 29 return buildD; 30 } 31 public void setBuildD(String buildD) { 32 this.buildD = buildD; 33 } 34 @Override 35 public String toString() { 36 return buildA+"\n"+buildB+"\n"+buildC+"\n"+buildD+"\n"+"房子验收完成"; 37 } 38 } 39 40 /** 41 * LinkedBuilder.java 42 * 建造者 43 */ 44 public abstract class LinkedBuilder { 45 //地基 46 abstract LinkedBuilder bulidA(); 47 //钢筋工程 48 abstract LinkedBuilder bulidB(); 49 //铺电线 50 abstract LinkedBuilder bulidC(); 51 //粉刷 52 abstract LinkedBuilder bulidD(); 53 //完工-获取产品 54 abstract Product getProduct(); 55 } 56 57 /** 58 * LinkedConcreteBuilder.java 59 * 具体建造者(工人) 60 */ 61 public class LinkedConcreteBuilder extends LinkedBuilder { 62 private Product product; 63 public LinkedConcreteBuilder() { 64 product = new Product(); 65 } 66 @Override 67 LinkedBuilder bulidA() { 68 product.setBuildA("地基"); 69 return this; 70 } 71 @Override 72 LinkedBuilder bulidB() { 73 product.setBuildB("钢筋工程"); 74 return this; 75 } 76 @Override 77 LinkedBuilder bulidC() { 78 product.setBuildC("铺电线"); 79 return this; 80 } 81 @Override 82 LinkedBuilder bulidD() { 83 product.setBuildD("粉刷"); 84 return this; 85 } 86 @Override 87 Product getProduct() { 88 return product; 89 } 90 } 91 92 /** 93 * LinkedDirector.java 94 * 指挥者 95 */ 96 public class LinkedDirector { 97 //指挥工人按顺序造房 98 public Product create(LinkedBuilder builder) { 99 return builder.bulidA().bulidB().bulidC().bulidD().getProduct(); 100 } 101 } 102 103 public class LinkedBuilderTest { 104 105 public static void main(String[] args) { 106 LinkedDirector director = new LinkedDirector(); 107 Product create = director.create(new LinkedConcreteBuilder()); 108 System.out.println(create.toString()); 109 } 110 }
7.建造者模式的优缺点
A.优点
a.封装性好,创建和使用分离
b.扩展性好,建造类之间独立、一定程度上解耦
B.缺点
a.产生多余的Builder对象
b.产品内部发生变化,建造者都要修改,成本较大
8.建造者模式和工厂模式的区别
A.建造者模式更加注重方法的调用顺序,工厂模式注重于创建对象
B.创建对象的力度不同,建造者模式创建复杂的对象,由各种复杂的部件组成,工厂模式创建出来的都一样
C.关注重点不一样,工厂模式只需要把对象创建出来就可以了,而建造者模式中不仅要创建出这个对象,还要知道这个对象由哪些部件组成
D.建造者模式根据建造过程中的顺序不一样,最终的对象部件组成也不一样